FREObject KinectDevice::freGetPointCloudFrame(FREObject argv[]) { FREObject objectPointsByteArray = argv[1]; const unsigned int numPointBytes = pointCloudGenerator->getByteArrayLength() * sizeof(short); if(numPointBytes == 0) return NULL; lockPointCloudMutex(); FREByteArray pointsByteArray; FREObject pointsLength; FRENewObjectFromUint32(numPointBytes, &pointsLength); FRESetObjectProperty(objectPointsByteArray, (const uint8_t*) "length", pointsLength, NULL); FREAcquireByteArray(objectPointsByteArray, &pointsByteArray); memcpy(pointsByteArray.bytes, pointCloudGenerator->getTargetBytes(), numPointBytes); FREReleaseByteArray(objectPointsByteArray); //set the region information? FREObject asPointCloudRegions = argv[2]; if(asPointCloudRegions != NULL && &pointCloudRegions != 0) { //loop through these actionscript regions and get the native info back FREObject asPointCloudRegion, asRegionId; FREObject asNumPoints; unsigned int regionId; uint32_t freNumRegions; FREGetArrayLength(asPointCloudRegions, &freNumRegions); for(unsigned int i = 0; i < freNumRegions; i++) { FREGetArrayElementAt(asPointCloudRegions, i, &asPointCloudRegion); FREGetObjectProperty(asPointCloudRegion, (const uint8_t *) "regionId", &asRegionId, NULL); FREGetObjectAsUint32(asRegionId, ®ionId); //get the region with this id from the device memory for(unsigned int j = 0; j < numRegions; j++) { PointCloudRegion *nativeRegion = &pointCloudRegions[j]; if(nativeRegion->regionId == regionId) { //update the actionscript properties FRENewObjectFromUint32(nativeRegion->numPoints, &asNumPoints); FRESetObjectProperty(asPointCloudRegion, (const uint8_t *) "numPoints", asNumPoints, NULL); break; } } } } unlockPointCloudMutex(); return NULL; }
// converts a FREObject string-array to a std::vector std::vector<std::string> extractStringArray(FREObject object) { std::vector<std::string> tags; uint32 arrayLength; if (FREGetArrayLength(object, &arrayLength) != FRE_OK) return tags; tags.reserve(arrayLength); for (uint32 i = 0; i < arrayLength; ++i) { FREObject value; if (FREGetArrayElementAt(object, i, &value) != FRE_OK) continue; std::string strval; if (!FREGetString(value, strval)) continue; tags.push_back(strval); } return tags; }
FREObject KinectDevice::freSetPointCloudRegions(FREObject argv[]) { FREObject asPointCloudRegions = argv[1]; FREObject asPointCloudRegion, asRegionId, asX, asY, asZ, asWidth, asHeight, asDepth; unsigned int regionId; double x, y, z, width, height, depth; uint32_t freNumRegions; FREGetArrayLength(asPointCloudRegions, &freNumRegions); PointCloudRegion *nativeRegions = new PointCloudRegion[freNumRegions]; for(unsigned int i = 0; i < freNumRegions; i++) { FREGetArrayElementAt(asPointCloudRegions, i, &asPointCloudRegion); FREGetObjectProperty(asPointCloudRegion, (const uint8_t *) "regionId", &asRegionId, NULL); FREGetObjectProperty(asPointCloudRegion, (const uint8_t *) "x", &asX, NULL); FREGetObjectProperty(asPointCloudRegion, (const uint8_t *) "y", &asY, NULL); FREGetObjectProperty(asPointCloudRegion, (const uint8_t *) "z", &asZ, NULL); FREGetObjectProperty(asPointCloudRegion, (const uint8_t *) "width", &asWidth, NULL); FREGetObjectProperty(asPointCloudRegion, (const uint8_t *) "height", &asHeight, NULL); FREGetObjectProperty(asPointCloudRegion, (const uint8_t *) "depth", &asDepth, NULL); FREGetObjectAsUint32(asRegionId, ®ionId); FREGetObjectAsDouble(asX, &x); FREGetObjectAsDouble(asY, &y); FREGetObjectAsDouble(asZ, &z); FREGetObjectAsDouble(asWidth, &width); FREGetObjectAsDouble(asHeight, &height); FREGetObjectAsDouble(asDepth, &depth); PointCloudRegion *nativeRegion = new PointCloudRegion(); nativeRegion->setProperties(regionId, x, y, z, width, height, depth); nativeRegions[i] = *nativeRegion; } this->pointCloudRegions = nativeRegions; this->numRegions = freNumRegions; return NULL; }
FREObject KinectDevice::freChooseSkeletons(FREObject argv[]) { FREObject asSkeletonIds = argv[1]; FREObject asSkeletonId; int skeletonId; uint32_t freNumChosenSkeletonIds; FREGetArrayLength(asSkeletonIds, &freNumChosenSkeletonIds); int *freChosenSkeletonIds = new int[freNumChosenSkeletonIds]; for(unsigned int i = 0; i < freNumChosenSkeletonIds; i++) { FREGetArrayElementAt(asSkeletonIds, i, &asSkeletonId); FREGetObjectAsInt32(asSkeletonId, &skeletonId); freChosenSkeletonIds[i] = skeletonId; } this->chosenSkeletonIds = freChosenSkeletonIds; this->numChosenSkeletons = freNumChosenSkeletonIds; return NULL; }
FREObject getScores(FREContext ctx, void* functionData, uint32_t argc, FREObject argv[]) { SC_ScoreList_h score_list; SC_Score_h aScore; FREObject returnObject; int i,j; unsigned int contextArrayLength = 0; FREGetArrayLength(argv[0],&contextArrayLength); score_list = SC_ScoresController_GetScores(scores_controller); // arrayArgs has the Array arguments. #if defined(BB10) unsigned int scoreListSize = SC_ScoreList_GetCount(score_list); #else unsigned int scoreListSize = SC_ScoreList_GetScoresCount(score_list); #endif FREObject* arrayArgs = (FREObject*)malloc(sizeof(FREObject)*scoreListSize); for(i = 0 ; i < scoreListSize ; i++) { #if defined(BB10) aScore = SC_ScoreList_GetAt(score_list,i); #else aScore = SC_ScoreList_GetScore(score_list,i); #endif FREObject* argV=(FREObject*)malloc(sizeof(FREObject)*6); FRENewObjectFromInt32(SC_Score_GetMode(aScore), &argV[0]); FRENewObjectFromInt32(SC_Score_GetLevel(aScore), &argV[1]); FRENewObjectFromDouble(SC_Score_GetResult(aScore), &argV[2]); FRENewObjectFromDouble(SC_Score_GetMinorResult(aScore), &argV[3]); // Create the 5th argument(User) SC_User_h aUser = SC_Score_GetUser(aScore); SC_String_h scLogin = SC_User_GetLogin(aUser); SC_String_h scEmail = SC_User_GetEmail(aUser); const char * login = ""; const char * email = ""; if(scLogin != NULL) login= SC_String_GetData(scLogin); if(scEmail != NULL) email = SC_String_GetData(scEmail); FREObject* userArgV=(FREObject*)malloc(sizeof(FREObject)*2); FRENewObjectFromUTF8(strlen(login)+1,(const uint8_t*)login, &userArgV[0]); FRENewObjectFromUTF8(strlen(email)+1,(const uint8_t*)email, &userArgV[1]); fprintf(stderr, "username: %s\n", login); FRENewObject((const uint8_t*)"com.wallwizz.scoreloop.User",2,userArgV,&argV[4],NULL); // Create the 6th argument(Context) FREObject* contextArray = (FREObject*)malloc(sizeof(FREObject)*contextArrayLength); for(j = 0; j < contextArrayLength; j++) { FREObject context; FREObject freContextKey; const char * aKey = "test"; SC_String_h scValue = NULL; const char* aValue = NULL; unsigned int length; FREGetArrayElementAt(argv[0], j, &freContextKey); if(FREGetObjectAsUTF8(freContextKey,&length,(const uint8_t**)&aKey) != FRE_OK) fprintf(stderr, "FREGetArrayElementAt Error\n"); fprintf(stderr, "retrieved aKey: %s\n", aKey); SC_Context_h aContext = SC_Score_GetContext(aScore); SC_Context_Get(aContext, aKey, &scValue); if(scValue != NULL) { aValue= SC_String_GetData(scValue); }else{ fprintf(stderr, "scValue NULL\n"); aValue = "not found"; } fprintf(stderr, "retrieved aValue: %s\n", aValue); FREObject* contextArgv=(FREObject*)malloc(sizeof(FREObject)*2); FRENewObjectFromUTF8(strlen(aKey)+1,(const uint8_t*)aKey, &contextArgv[0]); FRENewObjectFromUTF8(strlen(aValue)+1,(const uint8_t*)aValue, &contextArgv[1]); FRENewObject((const uint8_t*)"com.wallwizz.scoreloop.Context",2,contextArgv,&contextArray[j],NULL); free(contextArgv); } FRENewObject((const uint8_t*)"Array",contextArrayLength,contextArray,&argV[5],NULL); FRENewObject((const uint8_t*)"com.wallwizz.scoreloop.Score",6,argV,&arrayArgs[i],NULL); free(contextArray); } FRENewObject((const uint8_t*)"Array",scoreListSize,arrayArgs,&returnObject,NULL); free(arrayArgs); return returnObject; }
FREObject LNLeapDevice::getFrame() { Frame frame = controller->frame(); // TODO: Only continue with valid Frame? FREObject freCurrentFrame; FRENewObject( (const uint8_t*) "com.leapmotion.leap.Frame", 0, NULL, &freCurrentFrame, NULL); FREObject freFrameId; FRENewObjectFromInt32((int32_t) frame.id(), &freFrameId); FRESetObjectProperty(freCurrentFrame, (const uint8_t*) "id", freFrameId, NULL); const Vector frameTranslation = frame.translation(lastFrame); FRESetObjectProperty(freCurrentFrame, (const uint8_t*) "translationVector", createVector3(frameTranslation.x, frameTranslation.y, frameTranslation.z), NULL); const Matrix frameRotation = frame.rotationMatrix(lastFrame); FRESetObjectProperty(freCurrentFrame, (const uint8_t*) "rotation", createMatrix( createVector3(frameRotation.xBasis[0], frameRotation.xBasis[1], frameRotation.xBasis[2]), createVector3(frameRotation.yBasis[0], frameRotation.yBasis[1], frameRotation.yBasis[2]), createVector3(frameRotation.zBasis[0], frameRotation.zBasis[1], frameRotation.zBasis[2]), createVector3(frameRotation.origin[0], frameRotation.origin[1], frameRotation.origin[2]) ), NULL); FREObject freFrameScaleFactor; FRENewObjectFromDouble(frame.scaleFactor(lastFrame), &freFrameScaleFactor); FRESetObjectProperty(freCurrentFrame, (const uint8_t*) "scaleFactorNumber", freFrameScaleFactor, NULL); FREObject freTimestamp; FRENewObjectFromInt32((int32_t) frame.timestamp(), &freTimestamp); FRESetObjectProperty(freCurrentFrame, (const uint8_t*) "timestamp", freTimestamp, NULL); std::map<int, FREObject> freHandsMap; if (!frame.hands().empty()) { FREObject freHands; FREGetObjectProperty(freCurrentFrame, (const uint8_t*) "hands", &freHands, NULL); for(int i = 0; i < frame.hands().count(); i++) { const Hand hand = frame.hands()[i]; FREObject freHand; FRENewObject( (const uint8_t*) "com.leapmotion.leap.Hand", 0, NULL, &freHand, NULL); FRESetObjectProperty(freHand, (const uint8_t*) "frame", freCurrentFrame, NULL); FRESetObjectProperty(freHand, (const uint8_t*) "direction", createVector3(hand.direction()[0], hand.direction()[1], hand.direction()[2]), NULL); FREObject freHandId; FRENewObjectFromInt32(hand.id(), &freHandId); FRESetObjectProperty(freHand, (const uint8_t*) "id", freHandId, NULL); FRESetObjectProperty(freHand, (const uint8_t*) "palmNormal", createVector3(hand.palmNormal()[0], hand.palmNormal()[1], hand.palmNormal()[2]), NULL); FRESetObjectProperty(freHand, (const uint8_t*) "palmPosition", createVector3(hand.palmPosition()[0], hand.palmPosition()[1], hand.palmPosition()[2]), NULL); FRESetObjectProperty(freHand, (const uint8_t*) "palmVelocity", createVector3(hand.palmVelocity()[0], hand.palmVelocity()[1], hand.palmVelocity()[2]), NULL); const Matrix rotation = hand.rotationMatrix(lastFrame); FRESetObjectProperty(freHand, (const uint8_t*) "rotation", createMatrix( createVector3(rotation.xBasis[0], rotation.xBasis[1], rotation.xBasis[2]), createVector3(rotation.yBasis[0], rotation.yBasis[1], rotation.yBasis[2]), createVector3(rotation.zBasis[0], rotation.zBasis[1], rotation.zBasis[2]), createVector3(rotation.origin[0], rotation.origin[1], rotation.origin[2]) ), NULL); FREObject freScaleFactor; FRENewObjectFromDouble(hand.scaleFactor(lastFrame), &freScaleFactor); FRESetObjectProperty(freHand, (const uint8_t*) "scaleFactorNumber", freScaleFactor, NULL); FRESetObjectProperty(freHand, (const uint8_t*) "sphereCenter", createVector3(hand.sphereCenter()[0], hand.sphereCenter()[1], hand.sphereCenter()[2]), NULL); FREObject freSphereRadius; FRENewObjectFromDouble(hand.sphereRadius(), &freSphereRadius); FRESetObjectProperty(freHand, (const uint8_t*) "sphereRadius", freSphereRadius, NULL); const Vector translation = hand.translation(lastFrame); FRESetObjectProperty(freHand, (const uint8_t*) "translationVector", createVector3(translation.x, translation.y, translation.z), NULL); FRESetArrayElementAt(freHands, i, freHand); freHandsMap[hand.id()] = freHand; } } std::map<int, FREObject> frePointablesMap; if(!frame.pointables().empty()) { FREObject frePointables; FREGetObjectProperty(freCurrentFrame, (const uint8_t*) "pointables", &frePointables, NULL); for(int i = 0; i < frame.pointables().count(); i++) { const Pointable pointable = frame.pointables()[i]; FREObject frePointable; if(pointable.isTool()) { FRENewObject( (const uint8_t*) "com.leapmotion.leap.Tool", 0, NULL, &frePointable, NULL); } else { FRENewObject( (const uint8_t*) "com.leapmotion.leap.Finger", 0, NULL, &frePointable, NULL); } FRESetObjectProperty(frePointable, (const uint8_t*) "frame", freCurrentFrame, NULL); FREObject frePointableId; FRENewObjectFromInt32(pointable.id(), &frePointableId); FRESetObjectProperty(frePointable, (const uint8_t*) "id", frePointableId, NULL); FREObject frePointableLength; FRENewObjectFromDouble(pointable.length(), &frePointableLength); FRESetObjectProperty(frePointable, (const uint8_t*) "length", frePointableLength, NULL); FREObject frePointableWidth; FRENewObjectFromDouble(pointable.width(), &frePointableWidth); FRESetObjectProperty(frePointable, (const uint8_t*) "width", frePointableWidth, NULL); FRESetObjectProperty(frePointable, (const uint8_t*) "direction", createVector3(pointable.direction().x, pointable.direction().y, pointable.direction().z), NULL); FRESetObjectProperty(frePointable, (const uint8_t*) "tipPosition", createVector3(pointable.tipPosition().x, pointable.tipPosition().y, pointable.tipPosition().z), NULL); FRESetObjectProperty(frePointable, (const uint8_t*) "tipVelocity", createVector3(pointable.tipVelocity().x, pointable.tipVelocity().y, pointable.tipVelocity().z), NULL); //map to hand & back if(pointable.hand().isValid()) { FREObject freHand = freHandsMap[pointable.hand().id()]; FRESetObjectProperty(frePointable, (const uint8_t*) "hand", freHand, NULL); FREObject frePointables; FREGetObjectProperty(freHand, (const uint8_t*) "pointables", &frePointables, NULL); uint32_t numPointables; FREGetArrayLength(frePointables, &numPointables); FRESetArrayElementAt(frePointables, numPointables, frePointable); FREObject freSpecificHandPointables; if(pointable.isTool()) { FREGetObjectProperty(freHand, (const uint8_t*) "tools", &freSpecificHandPointables, NULL); } else { FREGetObjectProperty(freHand, (const uint8_t*) "fingers", &freSpecificHandPointables, NULL); } uint32_t numSpecificHandTools; FREGetArrayLength(freSpecificHandPointables, &numSpecificHandTools); FRESetArrayElementAt(freSpecificHandPointables, numSpecificHandTools, frePointable); } //push it in current frame FRESetArrayElementAt(frePointables, i, frePointable); //specific FREObject freSpecificPointables; if(pointable.isTool()) { FREGetObjectProperty(freCurrentFrame, (const uint8_t*) "tools", &freSpecificPointables, NULL); } else { FREGetObjectProperty(freCurrentFrame, (const uint8_t*) "fingers", &freSpecificPointables, NULL); } uint32_t numSpecificTools; FREGetArrayLength(freSpecificPointables, &numSpecificTools); FRESetArrayElementAt(freSpecificPointables, numSpecificTools, frePointable); frePointablesMap[pointable.id()] = frePointable; } } if(!frame.gestures().empty()) { FREObject freGestures; FREGetObjectProperty(freCurrentFrame, (const uint8_t*) "gesturesVector", &freGestures, NULL); for(int i = 0; i < frame.gestures().count(); i++) { const Gesture gesture = frame.gestures()[i]; int state; switch (gesture.state()) { case Gesture::STATE_INVALID: state = 0; break; case Gesture::STATE_START: state = 1; break; case Gesture::STATE_UPDATE: state = 2; break; case Gesture::STATE_STOP: state = 3; break; default: break; } int type; FREObject freGesture; switch (gesture.type()) { case Gesture::TYPE_SWIPE: { type = 5; SwipeGesture swipe = gesture; FRENewObject( (const uint8_t*) "com.leapmotion.leap.SwipeGesture", 0, NULL, &freGesture, NULL); FRESetObjectProperty(freGesture, (const uint8_t*) "direction", createVector3(swipe.direction().x, swipe.direction().y, swipe.direction().z), NULL); FRESetObjectProperty(freGesture, (const uint8_t*) "position", createVector3(swipe.position().x, swipe.position().y, swipe.position().z), NULL); FRESetObjectProperty(freGesture, (const uint8_t*) "startPosition", createVector3(swipe.startPosition().x, swipe.startPosition().y, swipe.startPosition().z), NULL); FREObject freSwipeGestureSpeed; FRENewObjectFromDouble(swipe.speed(), &freSwipeGestureSpeed); FRESetObjectProperty(freGesture, (const uint8_t*) "speed", freSwipeGestureSpeed, NULL); break; } case Gesture::TYPE_CIRCLE: { type = 6; CircleGesture circle = gesture; FRENewObject( (const uint8_t*) "com.leapmotion.leap.CircleGesture", 0, NULL, &freGesture, NULL); FRESetObjectProperty(freGesture, (const uint8_t*) "center", createVector3(circle.center().x, circle.center().y, circle.center().z), NULL); FRESetObjectProperty(freGesture, (const uint8_t*) "normal", createVector3(circle.normal().x, circle.normal().y, circle.normal().z), NULL); FREObject freCircleGestureProgress; FRENewObjectFromDouble(circle.progress(), &freCircleGestureProgress); FRESetObjectProperty(freGesture, (const uint8_t*) "progress", freCircleGestureProgress, NULL); FREObject freCircleGestureRadius; FRENewObjectFromDouble(circle.radius(), &freCircleGestureRadius); FRESetObjectProperty(freGesture, (const uint8_t*) "radius", freCircleGestureRadius, NULL); FREObject frePointable = frePointablesMap[circle.pointable().id()]; if(frePointable != NULL) { FRESetObjectProperty(freGesture, (const uint8_t*) "pointable", frePointable, NULL); } break; } case Gesture::TYPE_SCREEN_TAP: { type = 7; ScreenTapGesture screentap = gesture; FRENewObject( (const uint8_t*) "com.leapmotion.leap.ScreenTapGesture", 0, NULL, &freGesture, NULL); FRESetObjectProperty(freGesture, (const uint8_t*) "direction", createVector3(screentap.direction().x, screentap.direction().y, screentap.direction().z), NULL); FRESetObjectProperty(freGesture, (const uint8_t*) "position", createVector3(screentap.position().x, screentap.position().y, screentap.position().z), NULL); break; } case Gesture::TYPE_KEY_TAP: { type = 8; KeyTapGesture tap = gesture; FRENewObject( (const uint8_t*) "com.leapmotion.leap.KeyTapGesture", 0, NULL, &freGesture, NULL); FRESetObjectProperty(freGesture, (const uint8_t*) "direction", createVector3(tap.direction().x, tap.direction().y, tap.direction().z), NULL); FRESetObjectProperty(freGesture, (const uint8_t*) "position", createVector3(tap.position().x, tap.position().y, tap.position().z), NULL); break; } default: { type = 4; FRENewObject( (const uint8_t*) "com.leapmotion.leap.Gesture", 0, NULL, &freGesture, NULL); break; } } FREObject freGestureState; FRENewObjectFromInt32(state, &freGestureState); FRESetObjectProperty(freGesture, (const uint8_t*) "state", freGestureState, NULL); FREObject freGestureType; FRENewObjectFromInt32(type, &freGestureType); FRESetObjectProperty(freGesture, (const uint8_t*) "type", freGestureType, NULL); FREObject freGestureDuration; FRENewObjectFromInt32((int32_t) gesture.duration(), &freGestureDuration); FRESetObjectProperty(freGesture, (const uint8_t*) "duration", freGestureDuration, NULL); FREObject freGestureDurationSeconds; FRENewObjectFromDouble(gesture.durationSeconds(), &freGestureDurationSeconds); FRESetObjectProperty(freGesture, (const uint8_t*) "durationSeconds", freGestureDurationSeconds, NULL); FRESetObjectProperty(freGesture, (const uint8_t*) "frame", freCurrentFrame, NULL); FREObject freGestureId; FRENewObjectFromInt32(gesture.id(), &freGestureId); FRESetObjectProperty(freGesture, (const uint8_t*) "id", freGestureId, NULL); if (!gesture.hands().empty()) { FREObject freGestureHands; FREGetObjectProperty(freGesture, (const uint8_t*) "hands", &freGestureHands, NULL); for(int i = 0; i < gesture.hands().count(); i++) { const Hand hand = gesture.hands()[i]; FREObject freHand = freHandsMap[hand.id()]; FRESetArrayElementAt(freGestureHands, i, freHand); } } if (!gesture.pointables().empty()) { FREObject freGesturePointables; FREGetObjectProperty(freGesture, (const uint8_t*) "pointables", &freGesturePointables, NULL); for(int i = 0; i < gesture.pointables().count(); i++) { const Pointable pointable = gesture.pointables()[i]; FREObject frePointable = frePointablesMap[pointable.id()]; FRESetArrayElementAt(freGesturePointables, i, frePointable); } } //push it in current gesture vector FRESetArrayElementAt(freGestures, i, freGesture); } } lastFrame = frame; return freCurrentFrame; }