diff --git a/RemoteCaptury.cpp b/RemoteCaptury.cpp index e646be9..c962e20 100644 --- a/RemoteCaptury.cpp +++ b/RemoteCaptury.cpp @@ -566,6 +566,8 @@ const char* Captury_getHumanReadableMessageType(CapturyPacketTypes type) return ""; case capturyFramerate: return ""; + case capturyBoneTypes: + return "" } return ""; } @@ -1219,6 +1221,7 @@ static bool receive(SOCKET& sok) actor->joints[j].orientation[x] = cacp->joints[k].orientation[x]; actor->joints[j].scale[x] = 1.0f; } + actor->joints[j].boneType = CAPTURY_UNKNOWN_BONE; } break; } case 2: { @@ -1232,6 +1235,7 @@ static bool receive(SOCKET& sok) actor->joints[j].orientation[x] = jp->orientation[x]; actor->joints[j].scale[x] = 1.0f; } + actor->joints[j].boneType = CAPTURY_UNKNOWN_BONE; strncpy(actor->joints[j].name, jp->name, sizeof(actor->joints[j].name)-1); at += sizeof(CapturyJointPacket2) + strlen(jp->name) + 1; } @@ -1247,6 +1251,7 @@ static bool receive(SOCKET& sok) actor->joints[j].orientation[x] = jp->orientation[x]; actor->joints[j].scale[x] = jp->scale[x]; } + actor->joints[j].boneType = CAPTURY_UNKNOWN_BONE; strncpy(actor->joints[j].name, jp->name, sizeof(actor->joints[j].name)-1); at += sizeof(CapturyJointPacket3) + strlen(jp->name) + 1; } @@ -1283,6 +1288,14 @@ static bool receive(SOCKET& sok) } unlockMutex(&mutex); break; } + case capturyBoneTypes: { + CapturyBoneTypesPacket* cbt = (CapturyBoneTypesPacket*)p; + lockMutex(&mutex); + CapturyActor_p actor = actorsById[cbt->actorId]; + for (int i = 0; i < std::min(actor->numJoints, size - sizeof(CapturyBoneTypesPacket)); ++i) + actor->joints[i].boneType = cbt->boneTypes[i]; + unlockMutex(&mutex); + break; } case capturyCamera: { CapturyCamera camera; CapturyCameraPacket* ccp = (CapturyCameraPacket*)p; diff --git a/RemoteCaptury.h b/RemoteCaptury.h index 15c45ee..6a88633 100644 --- a/RemoteCaptury.h +++ b/RemoteCaptury.h @@ -461,6 +461,7 @@ typedef enum { capturyActors = 1, capturyActor = 2, capturyDisableRemoteLogging = 77, capturyGetFramerate = 78, capturyFramerate = 79, + capturyBoneTypes = 80, capturyError = 0 } CapturyPacketTypes; // returns a string for nicer error messages @@ -941,6 +942,15 @@ struct CapturyFrameratePacket { int denominator; }; +// sent to client +struct CapturyBoneTypesPacket { + int32_t type; // capturyBoneIndices + int32_t size; // size of full message including type and size + + int32_t actorId; + uint8_t boneTypes[]; +}; + #pragma pack(pop) #ifndef FOURCC diff --git a/captury/PublicStructs.h b/captury/PublicStructs.h index 8316f59..925e605 100644 --- a/captury/PublicStructs.h +++ b/captury/PublicStructs.h @@ -5,12 +5,75 @@ #pragma pack(push, 1) +enum CapturyBoneTypes { + CAPTURY_UNKNOWN_BONE = -1, + CAPTURY_HIPS = 0, // the joint where legs attach to the spine + CAPTURY_SPINE, + CAPTURY_NECK, + CAPTURY_HEAD, + CAPTURY_LEFT_CLAVICLE, + CAPTURY_LEFT_SHOULDER, + CAPTURY_LEFT_ELBOW, + CAPTURY_LEFT_WRIST, + CAPTURY_LEFT_THUMB_METACARPAL, + CAPTURY_LEFT_THUMB_MEDIAL, + CAPTURY_LEFT_THUMB_DISTAL, + CAPTURY_LEFT_INDEX_METACARPAL, + CAPTURY_LEFT_INDEX_PROXIMAL, + CAPTURY_LEFT_INDEX_MEDIAL, + CAPTURY_LEFT_INDEX_DISTAL, + CAPTURY_LEFT_MIDDLE_METACARPAL, + CAPTURY_LEFT_MIDDLE_PROXIMAL, + CAPTURY_LEFT_MIDDLE_MEDIAL, + CAPTURY_LEFT_MIDDLE_DISTAL, + CAPTURY_LEFT_RING_METACARPAL, + CAPTURY_LEFT_RING_PROXIMAL, + CAPTURY_LEFT_RING_MEDIAL, + CAPTURY_LEFT_RING_DISTAL, + CAPTURY_LEFT_PINKY_METACARPAL, + CAPTURY_LEFT_PINKY_PROXIMAL, + CAPTURY_LEFT_PINKY_MEDIAL, + CAPTURY_LEFT_PINKY_DISTAL, + CAPTURY_RIGHT_CLAVICLE, + CAPTURY_RIGHT_SHOULDER, + CAPTURY_RIGHT_ELBOW, + CAPTURY_RIGHT_WRIST, + CAPTURY_RIGHT_THUMB_METACARPAL, + CAPTURY_RIGHT_THUMB_MEDIAL, + CAPTURY_RIGHT_THUMB_DISTAL, + CAPTURY_RIGHT_INDEX_METACARPAL, + CAPTURY_RIGHT_INDEX_PROXIMAL, + CAPTURY_RIGHT_INDEX_MEDIAL, + CAPTURY_RIGHT_INDEX_DISTAL, + CAPTURY_RIGHT_MIDDLE_METACARPAL, + CAPTURY_RIGHT_MIDDLE_PROXIMAL, + CAPTURY_RIGHT_MIDDLE_MEDIAL, + CAPTURY_RIGHT_MIDDLE_DISTAL, + CAPTURY_RIGHT_RING_METACARPAL, + CAPTURY_RIGHT_RING_PROXIMAL, + CAPTURY_RIGHT_RING_MEDIAL, + CAPTURY_RIGHT_RING_DISTAL, + CAPTURY_RIGHT_PINKY_METACARPAL, + CAPTURY_RIGHT_PINKY_PROXIMAL, + CAPTURY_RIGHT_PINKY_MEDIAL, + CAPTURY_RIGHT_PINKY_DISTAL, + CAPTURY_LEFT_HIP, + CAPTURY_LEFT_KNEE, + CAPTURY_LEFT_ANKLE, + CAPTURY_LEFT_BALL, + CAPTURY_RIGHT_HIP, + CAPTURY_RIGHT_KNEE, + CAPTURY_RIGHT_ANKLE, + CAPTURY_RIGHT_BALL +}; + struct CapturyJoint { char name[64]; int32_t parent; // index of parent joint or -1 for root node float offset[3]; // offset to parent joint float orientation[3]; // XYZ quaternion - w needs to be reconstructed (w >= 0) float scale[3]; // local scale + int8_t boneType; // knowing which functional bone it is can make retargeting easier }; struct CapturyBlendShape {