LuaRef registerClass(lua_State* state)const { util::ScopedSavedStack save(state); if (class_userdata::newmetatable<class_type>(state)) { LuaTable metatable(state, StackTop()); metatable.push(); registerMember(state); if (!traits::is_same<base_class_type, void>::value || !property_map_.empty())//if base class has property and derived class hasnt property. need property access metamethod { for (PropMapType::const_iterator it = property_map_.begin(); it != property_map_.end(); ++it) { int count = lua_type_traits<FunctorType>::push(state, it->second); if (count > 1) { lua_pop(state, count - 1); count = 1; } if (count == 1) { lua_setfield(state, -2, ("_prop_" + it->first).c_str()); } } LuaFunction indexfun = kaguya::LuaFunction::loadstring(state, "local arg = {...};local metatable = arg[1];" "return function(table, index)" // " if type(table) == 'userdata' then " " local propfun = metatable['_prop_'..index];" " if propfun then return propfun(table) end " // " end " " return metatable[index]" " end")(metatable); metatable.setField("__index", indexfun); LuaFunction newindexfn = LuaFunction::loadstring(state, "local arg = {...};local metatable = arg[1];" " return function(table, index, value) " " if type(table) == 'userdata' then " " local propfun = metatable['_prop_'..index];" " if propfun then return propfun(table,value) end " " end " " rawset(table,index,value) " " end")(metatable); metatable.setField("__newindex", newindexfn); } else { metatable.setField("__index", metatable); } set_base_metatable(state, metatable, types::typetag<base_class_type>()); return metatable; } else { except::OtherError(state, typeid(class_type*).name() + std::string(" is already registered")); } return LuaRef(state); }
LuaTable createMatatable(lua_State* state)const { util::ScopedSavedStack save(state); if (class_userdata::newmetatable<class_type>(state)) { LuaStackRef metatable(state, -1); registerMember(state); if (!traits::is_same<base_class_type, void>::value || !property_map_.empty())//if base class has property and derived class hasnt property. need property access metamethod { LuaFunction indexfun = kaguya::LuaFunction::loadstring(state, "local arg = {...};local metatable = arg[1];" "return function(table, index)" // " if type(table) == 'userdata' then " " local propfun = metatable['_prop_'..index];" " if propfun then return propfun(table) end " // " end " " return metatable[index]" " end")(metatable); metatable.setField("__index", indexfun); LuaFunction newindexfn = LuaFunction::loadstring(state, "local arg = {...};local metatable = arg[1];" " return function(table, index, value) " " if type(table) == 'userdata' then " " local propfun = metatable['_prop_'..index];" " if propfun then return propfun(table,value) end " " end " " rawset(table,index,value) " " end")(metatable); metatable.setField("__newindex", newindexfn); } else { metatable.setField("__index", metatable); } set_base_metatable(state, metatable, types::typetag<base_class_type>()); return metatable; } else { except::OtherError(state, typeid(class_type*).name() + std::string(" is already registered")); } return LuaTable(); }
// The init() method should be called after construction. // Here, all config variables are registered to build a descriptor meta // structure that allows index and key based access to their values. // If you don't want to see a certain member on the gui, there is no // need to register it. void Config::init() { registerMember("captureStep.Cy", &Cy, 0.33); registerMember("captureStep.dy", &dy, 0.01); registerMember("captureStep.alpha", &alpha, 0.01); registerMember("captureStep.delta", &delta, 0.01); registerMember("captureStep.omega", &omega, 0.01); registerMember("captureStep.D", &D, 0.01); registerMember("captureStep.Z", &Z, 0.01); registerMember("captureStep.mu", &mu, 0.01 * PI); registerMember("captureStep.sigma", &sigma, 0.01); registerMember("captureStep.energy", &energy, 0.01); registerMember("captureStep.stepDelay", &stepDelay, 0.01); registerMember("captureStep.intensity", &intensity, 0.1); registerMember("captureStep.stepSizeFactorY", &stepSizeFactorY, 0.01); registerMember("captureStep.minEnergyDev", &minEnergyDev, 0.01); registerMember("motionInterface.inversePose.leftArmPose.handPosition.x", &motionInterface.inversePose.leftArmPose.handPosition.x, 0.01); registerMember("motionInterface.inversePose.leftArmPose.handPosition.y", &motionInterface.inversePose.leftArmPose.handPosition.y, 0.01); registerMember("motionInterface.inversePose.leftArmPose.handPosition.z", &motionInterface.inversePose.leftArmPose.handPosition.z, 0.01); registerMember("motionInterface.inversePose.rightArmPose.handPosition.x", &motionInterface.inversePose.rightArmPose.handPosition.x, 0.01); registerMember("motionInterface.inversePose.rightArmPose.handPosition.y", &motionInterface.inversePose.rightArmPose.handPosition.y, 0.01); registerMember("motionInterface.inversePose.rightArmPose.handPosition.z", &motionInterface.inversePose.rightArmPose.handPosition.z, 0.01); registerMember("motionInterface.inversePose.leftLegPose.footPosition.x", &motionInterface.inversePose.leftLegPose.footPosition.x, 0.01); registerMember("motionInterface.inversePose.leftLegPose.footPosition.y", &motionInterface.inversePose.leftLegPose.footPosition.y, 0.01); registerMember("motionInterface.inversePose.leftLegPose.footPosition.z", &motionInterface.inversePose.leftLegPose.footPosition.z, 0.01); registerMember("motionInterface.inversePose.leftLegPose.footAngle.x", &motionInterface.inversePose.leftLegPose.footAngle.x, 0.01); registerMember("motionInterface.inversePose.leftLegPose.footAngle.y", &motionInterface.inversePose.leftLegPose.footAngle.y, 0.01); registerMember("motionInterface.inversePose.leftLegPose.footAngle.z", &motionInterface.inversePose.leftLegPose.footAngle.z, 0.01); registerMember("motionInterface.inversePose.rightLegPose.footPosition.x", &motionInterface.inversePose.rightLegPose.footPosition.x, 0.01); registerMember("motionInterface.inversePose.rightLegPose.footPosition.y", &motionInterface.inversePose.rightLegPose.footPosition.y, 0.01); registerMember("motionInterface.inversePose.rightLegPose.footPosition.z", &motionInterface.inversePose.rightLegPose.footPosition.z, 0.01); registerMember("motionInterface.inversePose.rightLegPose.footAngle.x", &motionInterface.inversePose.rightLegPose.footAngle.x, 0.01); registerMember("motionInterface.inversePose.rightLegPose.footAngle.y", &motionInterface.inversePose.rightLegPose.footAngle.y, 0.01); registerMember("motionInterface.inversePose.rightLegPose.footAngle.z", &motionInterface.inversePose.rightLegPose.footAngle.z, 0.01); registerMember("motionInterface.abstractPose.leftArmPose.armAngle.x", &motionInterface.abstractPose.leftArmPose.armAngle.x, 0.01 * PI); registerMember("motionInterface.abstractPose.leftArmPose.armAngle.y", &motionInterface.abstractPose.leftArmPose.armAngle.y, 0.01 * PI); registerMember("motionInterface.abstractPose.leftArmPose.armAngle.z", &motionInterface.abstractPose.leftArmPose.armAngle.z, 0.01 * PI); registerMember("motionInterface.abstractPose.leftArmPose.armExtension", &motionInterface.abstractPose.leftArmPose.armExtension, 0.01); registerMember("motionInterface.abstractPose.rightArmPose.armAngle.x", &motionInterface.abstractPose.rightArmPose.armAngle.x, 0.01 * PI); registerMember("motionInterface.abstractPose.rightArmPose.armAngle.y", &motionInterface.abstractPose.rightArmPose.armAngle.y, 0.01 * PI); registerMember("motionInterface.abstractPose.rightArmPose.armAngle.z", &motionInterface.abstractPose.rightArmPose.armAngle.z, 0.01 * PI); registerMember("motionInterface.abstractPose.rightArmPose.armExtension", &motionInterface.abstractPose.rightArmPose.armExtension, 0.01); registerMember("motionInterface.abstractPose.leftLegPose.legAngle.x", &motionInterface.abstractPose.leftLegPose.legAngle.x, 0.01 * PI); registerMember("motionInterface.abstractPose.leftLegPose.legAngle.y", &motionInterface.abstractPose.leftLegPose.legAngle.y, 0.01 * PI); registerMember("motionInterface.abstractPose.leftLegPose.legAngle.z", &motionInterface.abstractPose.leftLegPose.legAngle.z, 0.01 * PI); registerMember("motionInterface.abstractPose.leftLegPose.legExtension", &motionInterface.abstractPose.leftLegPose.legExtension, 0.01); registerMember("motionInterface.abstractPose.leftLegPose.footAngle.x", &motionInterface.abstractPose.leftLegPose.footAngle.x, 0.01 * PI); registerMember("motionInterface.abstractPose.leftLegPose.footAngle.y", &motionInterface.abstractPose.leftLegPose.footAngle.y, 0.01 * PI); registerMember("motionInterface.abstractPose.rightLegPose.legAngle.x", &motionInterface.abstractPose.rightLegPose.legAngle.x, 0.01 * PI); registerMember("motionInterface.abstractPose.rightLegPose.legAngle.y", &motionInterface.abstractPose.rightLegPose.legAngle.y, 0.01 * PI); registerMember("motionInterface.abstractPose.rightLegPose.legAngle.z", &motionInterface.abstractPose.rightLegPose.legAngle.z, 0.01 * PI); registerMember("motionInterface.abstractPose.rightLegPose.legExtension", &motionInterface.abstractPose.rightLegPose.legExtension, 0.01); registerMember("motionInterface.abstractPose.rightLegPose.footAngle.x", &motionInterface.abstractPose.rightLegPose.footAngle.x, 0.01 * PI); registerMember("motionInterface.abstractPose.rightLegPose.footAngle.y", &motionInterface.abstractPose.rightLegPose.footAngle.y, 0.01 * PI); registerMember("motionInterface.pose.headPose.neck.y", &motionInterface.pose.headPose.neck.y, 0.01 * PI); registerMember("motionInterface.pose.headPose.neck.z", &motionInterface.pose.headPose.neck.z, 0.01 * PI); registerMember("motionInterface.pose.leftArmPose.shoulder.x", &motionInterface.pose.leftArmPose.shoulder.x, 0.01 * PI); registerMember("motionInterface.pose.leftArmPose.shoulder.y", &motionInterface.pose.leftArmPose.shoulder.y, 0.01 * PI); registerMember("motionInterface.pose.leftArmPose.shoulder.z", &motionInterface.pose.leftArmPose.shoulder.z, 0.01 * PI); registerMember("motionInterface.pose.leftArmPose.elbow.y", &motionInterface.pose.leftArmPose.elbow.y, 0.01 * PI); registerMember("motionInterface.pose.leftLegPose.hip.x", &motionInterface.pose.leftLegPose.hip.x, 0.01 * PI); registerMember("motionInterface.pose.leftLegPose.hip.y", &motionInterface.pose.leftLegPose.hip.y, 0.01 * PI); registerMember("motionInterface.pose.leftLegPose.hip.z", &motionInterface.pose.leftLegPose.hip.z, 0.01 * PI); registerMember("motionInterface.pose.leftLegPose.knee.y", &motionInterface.pose.leftLegPose.knee.y, 0.01 * PI); registerMember("motionInterface.pose.leftLegPose.ankle.x", &motionInterface.pose.leftLegPose.ankle.x, 0.01 * PI); registerMember("motionInterface.pose.leftLegPose.ankle.y", &motionInterface.pose.leftLegPose.ankle.y, 0.01 * PI); registerMember("motionInterface.pose.rightArmPose.shoulder.x", &motionInterface.pose.rightArmPose.shoulder.x, 0.01 * PI); registerMember("motionInterface.pose.rightArmPose.shoulder.y", &motionInterface.pose.rightArmPose.shoulder.y, 0.01 * PI); registerMember("motionInterface.pose.rightArmPose.shoulder.z", &motionInterface.pose.rightArmPose.shoulder.z, 0.01 * PI); registerMember("motionInterface.pose.rightArmPose.elbow.y", &motionInterface.pose.rightArmPose.elbow.y, 0.01 * PI); registerMember("motionInterface.pose.rightLegPose.hip.x", &motionInterface.pose.rightLegPose.hip.x, 0.01 * PI); registerMember("motionInterface.pose.rightLegPose.hip.y", &motionInterface.pose.rightLegPose.hip.y, 0.01 * PI); registerMember("motionInterface.pose.rightLegPose.hip.z", &motionInterface.pose.rightLegPose.hip.z, 0.01 * PI); registerMember("motionInterface.pose.rightLegPose.knee.y", &motionInterface.pose.rightLegPose.knee.y, 0.01 * PI); registerMember("motionInterface.pose.rightLegPose.ankle.x", &motionInterface.pose.rightLegPose.ankle.x, 0.01 * PI); registerMember("motionInterface.pose.rightLegPose.ankle.y", &motionInterface.pose.rightLegPose.ankle.y, 0.01 * PI); registerMember("haltPosition.armOffsetX", &armOffsetX, 0.01); registerMember("haltPosition.armOffsetY", &armOffsetY, 0.01); registerMember("haltPosition.armOffsetZ", &armOffsetZ, 0.01); registerMember("haltPosition.footOffsetX", &footOffsetX, 0.01); registerMember("haltPosition.footOffsetY", &footOffsetY, 0.01); registerMember("haltPosition.footOffsetZ", &footOffsetZ, 0.01); registerMember("haltPosition.footAngleX", &footAngleX, 0.01); registerMember("haltPosition.footAngleY", &footAngleY, 0.01); registerMember("haltPosition.footShiftY", &footShiftY, 0.005); registerMember("haltPosition.complianceTrunk", &complianceTrunk, 0.01); registerMember("haltPosition.complianceArm", &complianceArm, 0.01); registerMember("haltPosition.complianceLeg", &complianceLeg, 0.01); registerMember("haltPosition.complianceAnkle", &complianceAnkle, 0.01); registerMember("dynamicGait.gaitFrequency", &gaitFrequency, 0.1); registerMember("dynamicGait.gaitFrequencySlopeY", &gaitFrequencySlopeY, 0.1); registerMember("dynamicGait.gaitFrequencySlopeX", &gaitFrequencySlopeX, 0.01); registerMember("dynamicGait.accelerationBackward", &accelerationBackward, 0.01); registerMember("dynamicGait.accelerationForward", &accelerationForward, 0.01); registerMember("dynamicGait.accelerationRotational", &accelerationRotational, 0.01); registerMember("dynamicGait.accelerationSideward", &accelerationSideward, 0.1); registerMember("dynamicGait.decelerationFactor", &decelerationFactor, 0.1); registerMember("dynamicGait.GCVNormP", &GCVNormP, 0.1); registerMember("dynamicGait.pushHeight", &pushHeight, 0.01); registerMember("dynamicGait.pushHeightSlope", &pushHeightSlope, 0.01); registerMember("dynamicGait.stepHeight", &stepHeight, 0.01); registerMember("dynamicGait.stepHeightSlope", &stepHeightSlope, 0.01); registerMember("dynamicGait.swingStartTiming", &swingStartTiming, 0.01); registerMember("dynamicGait.swingStopTiming", &swingStopTiming, 0.01 * PI); registerMember("dynamicGait.armSwing", &armSwing, 0.01); registerMember("dynamicGait.armSwingSlope", &armSwingSlope, 0.01); registerMember("dynamicGait.stepLengthYSlope", &stepLengthYSlope, 0.01); registerMember("dynamicGait.stepLengthXPushout", &stepLengthXPushout, 0.01); registerMember("dynamicGait.stepLengthYPushout", &stepLengthYPushout, 0.01); registerMember("dynamicGait.stepLengthZPushout", &stepLengthZPushout, 0.01); registerMember("dynamicGait.stepLengthZSlope", &stepLengthZSlope, 0.01); registerMember("dynamicGait.stepLengthZVPushout", &stepLengthZVPushout, 0.05); registerMember("dynamicGait.stepLengthXSlopeFwd", &stepLengthXSlopeFwd, 0.01); registerMember("dynamicGait.stepLengthXSlopeBwd", &stepLengthXSlopeBwd, 0.01); registerMember("dynamicGait.lateralHipSwing", &lateralHipSwing, 0.001); registerMember("dynamicGait.lateralHipSwingSlope", &lateralHipSwingSlope, 0.001); registerMember("dynamicGait.rotationalHipSwingSlope", &rotationalHipSwingSlope, 0.01); registerMember("dynamicGait.firstStepDuration", &firstStepDuration, 0.01); registerMember("dynamicGait.firstStepHipSwing", &firstStepHipSwing, 0.01); registerMember("dynamicGait.stoppingVelocity", &stoppingVelocity, 0.01); registerMember("dynamicGait.tiltSpeedBwd", &tiltSpeedBwd, 0.01); registerMember("dynamicGait.tiltSpeedFwd", &tiltSpeedFwd, 0.01); registerMember("dynamicGait.tiltRotLean", &tiltRotLean, 0.01); registerMember("dynamicGait.supportSlope", &supportSlope, 0.05); registerMember("dynamicGait.footOffsetXAccSlope", &footOffsetXAccSlope, 0.001); registerMember("dynamicGait.stableSagAngleFront", &stableSagAngleFront, 0.01*PI); registerMember("dynamicGait.stableSagAngleSlope", &stableSagAngleSlope, 1); registerMember("damping.Minimum", &dampingMinimum, 0.01); registerMember("damping.Maximum", &dampingMaximum, 0.01); registerMember("damping.LateralSlope", &dampingLateralSlope, 0.01); registerMember("damping.SagittalSlope", &dampingSagittalSlope, 0.01); registerMember("damping.SlopeArmX", &dampingSlopeArmX, 0.01); registerMember("damping.SlopeArmY", &dampingSlopeArmY, 0.01); registerMember("fallProtectionRelaxAngle", &fallProtectionRelaxAngle, 1.0); registerMember("systemIterationTime", &systemIterationTime, 0.001); registerMember("fusedAngleCorrectionX", &fusedAngleCorrectionX, 0.001); registerMember("fusedAngleCorrectionY", &fusedAngleCorrectionY, 0.001); registerMember("simulation.solverIterations", &solverIterations, 1.0); registerMember("simulation.simulationFrequency", &simulationFrequency, 1.0); registerMember("dynamicGait.balanceOffset", &balanceOffset, 0.01); }