/** * nslExternalAnimation.cpp * * Copyright (c) 2011, Fumi.Iseki * */ #include "linden_common.h" #include "llcharacter.h" #include "nslExternalAnimation.h" using namespace nsl; static std::string SLJointName[] = { "mPelvis", "mTorso", "mChest", "mNeck", "mHead", "mCollarLeft", "mShoulderLeft", "mElbowLeft", "mWristLeft", "mCollarRight", "mShoulderRight", "mElbowRight", "mWristRight", "mHipLeft", "mKneeLeft", "mAnkleLeft", "mHipRight", "mKneeRight", "mAnkleRight" }; void ExternalAnimation::init(LLUUID id) { uuid = id; isExternal = FALSE; channel = ReadExternalAnimationUUID(id.asString()); // Shared Memory for IPC for (int i=0; i0) { isExternal = TRUE; CreateShm(); } } int ExternalAnimation::ReadExternalAnimationUUID(std::string uuid) { int chnnl = 0; char read_line[LEN_UUID_PARAM]; FILE* fp = fopen(ANIM_UUID_FNAME, "r"); if (fp==NULL) return chnnl; while (!feof(fp)) { fgets(read_line, LEN_UUID_PARAM, fp); char* read_uuid = pack_char(read_line, ' '); if (read_uuid!=NULL) { char* sparam = getSecondParam(read_uuid); std::string str = read_uuid; if (uuid==str) { if (sparam!=NULL) chnnl = atoi(sparam); if (chnnl<=0 || chnnl>SL_MAX_CHANNEL_NUM) chnnl = 1; ::free(read_uuid); break; } ::free(read_uuid); } } fclose(fp); return chnnl; } ///////////////////////////////////////////////////////////////////////////////////// // 共有メモリ void ExternalAnimation::CreateShm(void) { if (!isExternal) return; for (int i=0; i=SL_MAX_JOINT_NUM) return; if (ptrShm[n]==NULL) { if (mapHandle[n]==NULL) { mapHandle[n] = OpenFileMappingA(FILE_MAP_READ, FALSE, SLJointName[n].c_str()); } if (mapHandle[n]!=NULL) { ptrShm[n] = (double*)MapViewOfFile(mapHandle[n], FILE_MAP_READ, 0, 0, SL_SHM_SIZE*SL_MAX_CHANNEL_NUM); } } } void ExternalAnimation::CloseShm(void) { for (int i=0; i=0) { if (pp[i]==cc) i--; else break; } pp[i+1] = '\0'; return pp; }