FREObject LeapNative_getScreenProject(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) { leapnative::LNLeapDevice* device; FREGetContextNativeData(ctx, (void **) &device); int screenId; FREGetObjectAsInt32(argv[0], &screenId); double pX; FREGetObjectAsDouble(argv[1], &pX); double pY; FREGetObjectAsDouble(argv[2], &pY); double pZ; FREGetObjectAsDouble(argv[3], &pZ); bool normalize = createBoolFromFREObject(argv[4]); double clampRatio; FREGetObjectAsDouble(argv[5], &clampRatio); Vector position = Vector((float) pX, (float) pY, (float) pZ); return device->getScreenProject(screenId, position, normalize, (float) clampRatio); }
extern "C" FREObject createConeShape(FREContext ctx, void *funcData, uint32_t argc, FREObject argv[]) { FREObject as3_rad = argv[0]; FREObject as3_height = argv[1]; double rad, height; FREGetObjectAsDouble(as3_rad, &rad); FREGetObjectAsDouble(as3_height, &height); btCollisionShape* shape = new btConeShape(btScalar(rad), btScalar(height)); FREObject ptr; FRENewObjectFromUint32((uint32_t)shape, &ptr); return ptr; }
//start device class FREObject LeapNative_getDeviceDistanceToBoundary(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) { leapnative::LNLeapDevice* device; FREGetContextNativeData(ctx, (void **) &device); double pX; double pY; double pZ; FREGetObjectAsDouble(argv[0], &pX); FREGetObjectAsDouble(argv[1], &pY); FREGetObjectAsDouble(argv[2], &pZ); Vector position = Vector((float) pX, (float) pY, (float) pZ); return device->getDeviceDistanceToBoundary(position); }
extern "C" FREObject createRigidBody(FREContext ctx, void *funcData, uint32_t argc, FREObject argv[]) { FREObject as3_shape = argv[0]; FREObject as3_mass = argv[1]; FREObject as3_inertia = argv[2]; btCollisionShape* shape; double mass; FREGetObjectAsUint32(as3_shape, (uint32_t*)&shape); FREGetObjectAsDouble(as3_mass, &mass); bool isDynamic = (mass != 0.0f); btVector3 localInertia(0,0,0); if (as3_inertia) localInertia = vec3DToBtVector(as3_inertia); else if (isDynamic) shape->calculateLocalInertia((btScalar)mass, localInertia); // btMotionState* a3dMotionState = new Away3DMotionState(as3_skin); btMotionState* defaultMS = new btDefaultMotionState(); btRigidBody::btRigidBodyConstructionInfo rbInfo((btScalar)mass, defaultMS, shape, localInertia); btRigidBody* body = new btRigidBody(rbInfo); FREObject ptr; FRENewObjectFromUint32((uint32_t)body, &ptr); return ptr; }
//start screen class FREObject LeapNative_getScreenDistanceToPoint(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) { leapnative::LNLeapDevice* device; FREGetContextNativeData(ctx, (void **) &device); int screenId; double pX; double pY; double pZ; FREGetObjectAsInt32(argv[0], &screenId); FREGetObjectAsDouble(argv[1], &pX); FREGetObjectAsDouble(argv[2], &pY); FREGetObjectAsDouble(argv[3], &pZ); Vector point = Vector((float) pX, (float) pY, (float) pZ); return device->getScreenDistanceToPoint(screenId, point); }
FREObject exposureAtPoint(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) { int32_t id; double x, y; FREGetObjectAsInt32(argv[0], &id); FREGetObjectAsDouble(argv[1], &x); FREGetObjectAsDouble(argv[2], &y); CCapture *cap; cap = active_cams[id]; if(cap) { captureExposureAtPoint(cap, (float)x, (float)y); } return NULL; }
FREObject focusAtPoint(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) { int32_t _id; double _x, _y; FREGetObjectAsInt32(argv[0], &_id); FREGetObjectAsDouble(argv[1], &_x); FREGetObjectAsDouble(argv[2], &_y); CCapture* cap; cap = active_cams[_id]; if(cap) { captureFocusAtPoint(cap, (float)_x, (float)_y); } return NULL; }
FREObject LeapNative_imageWarp(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) { leapnative::LNLeapDevice* device; FREGetContextNativeData(ctx, (void **) &device); int imageId; FREGetObjectAsInt32(argv[0], &imageId); double pX; double pY; double pZ; FREGetObjectAsDouble(argv[1], &pX); FREGetObjectAsDouble(argv[2], &pY); FREGetObjectAsDouble(argv[3], &pZ); Vector xy = Vector((float) pX, (float) pY, (float) pZ); return device->imageWarp(imageId, xy); }
extern "C" FREObject RigidBodysetAngularDamping(FREContext ctx, void *funcData, uint32_t argc, FREObject argv[]) { FREObject as3_body = argv[0]; FREObject as3_damping = argv[1]; btRigidBody* body; double damping; FREGetObjectAsUint32(as3_body, (uint32_t*)&body); FREGetObjectAsDouble(as3_damping, &damping); body->setDamping(body->getLinearDamping(), btScalar(damping)); return NULL; }
FREObject LeapNative_getClosestScreenHit(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) { leapnative::LNLeapDevice* device; FREGetContextNativeData(ctx, (void **) &device); double pX; FREGetObjectAsDouble(argv[0], &pX); double pY; FREGetObjectAsDouble(argv[1], &pY); double pZ; FREGetObjectAsDouble(argv[2], &pZ); double dX; FREGetObjectAsDouble(argv[3], &dX); double dY; FREGetObjectAsDouble(argv[4], &dY); double dZ; FREGetObjectAsDouble(argv[5], &dZ); Vector position = Vector((float) pX, (float) pY, (float) pZ); Vector direction = Vector((float) dX, (float) dY, (float) dZ); return device->getClosestScreenHit(position, direction); }
FREObject LeapNative_setConfigFloat(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) { leapnative::LNLeapDevice* device; FREGetContextNativeData(ctx, (void **) &device); uint32_t len; const uint8_t* key = 0; FREGetObjectAsUTF8(argv[0], &len, &key); double value; FREGetObjectAsDouble(argv[1], &value); return device->setConfigFloat(len, key, (float)value); }
virtual void getWorldTransform(btTransform &worldTrans) const { FREObject trans, raw; FREGetObjectProperty(skin, (uint8_t*)"transform", &trans, NULL); FREGetObjectProperty(trans, (uint8_t*)"rawData", &raw, NULL); btScalar data[16]; for (int i=0; i < 16; i++) { FREObject val; double dval; FREGetArrayElementAt(raw, i, &val); FREGetObjectAsDouble(val, &dval); data[i] = btScalar(dval); } worldTrans.setFromOpenGLMatrix(data); }
extern "C" FREObject RigidBodysetMassProps(FREContext ctx, void *funcData, uint32_t argc, FREObject argv[]) { FREObject as3_body = argv[0]; FREObject as3_mass = argv[1]; FREObject as3_intertia = argv[2]; btRigidBody* body; double mass; FREGetObjectAsUint32(as3_body, (uint32_t*)&body); FREGetObjectAsDouble(as3_mass, &mass); btVector3 inertia; if (as3_intertia) { inertia = vec3DToBtVector(as3_intertia); } else if (mass == 0.0) { inertia = btVector3(0,0,0); } else { body->getCollisionShape()->calculateLocalInertia(btScalar(mass), inertia); } body->setMassProps(btScalar(mass), inertia); body->updateInertiaTensor(); return NULL; }
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; }
double getDoubleFromFREObject(FREObject arg) { double result = 0.0; FREGetObjectAsDouble(arg, &result); return result; }
bool FREGetDouble(FREObject object, double* val) { return (FREGetObjectAsDouble(object, val) == FRE_OK); }