Add mjmJoint, mjmCamera, and mjmLight to C API.
PiperOrigin-RevId: 605596008 Change-Id: Ie53ac4b99f5336380039ab5eb9b2ca4a82768b28
This commit is contained in:
committed by
Copybara-Service
parent
e77c3cb258
commit
e3cbad280c
+16
-8
@@ -38,6 +38,14 @@ void mjm_deleteModel(void* modelspec) {
|
||||
|
||||
|
||||
|
||||
// copy spec into private attributes
|
||||
MJAPI void mjm_finalize(mjElement object) {
|
||||
mjCBase* baseC = reinterpret_cast<mjCBase*>(object);
|
||||
baseC->CopyFromSpec();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// add child body to body, return child spec
|
||||
mjmBody* mjm_addBody(mjmBody* bodyspec, void* defspec) {
|
||||
mjCDef* def = static_cast<mjCDef*>(defspec);
|
||||
@@ -58,20 +66,20 @@ mjmSite* mjm_addSite(mjmBody* bodyspec, void* defspec) {
|
||||
|
||||
|
||||
// add joint to body
|
||||
void* mjm_addJoint(mjmBody* bodyspec, void* defspec) {
|
||||
mjmJoint* mjm_addJoint(mjmBody* bodyspec, void* defspec) {
|
||||
mjCDef* def = static_cast<mjCDef*>(defspec);
|
||||
mjCBody* body = reinterpret_cast<mjCBody*>(bodyspec->element);
|
||||
mjCJoint* joint = body->AddJoint(def);
|
||||
return joint;
|
||||
return &joint->spec;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// add free joint to body
|
||||
void* mjm_addFreeJoint(mjmBody* bodyspec) {
|
||||
mjmJoint* mjm_addFreeJoint(mjmBody* bodyspec) {
|
||||
mjCBody* body = reinterpret_cast<mjCBody*>(bodyspec->element);
|
||||
mjCJoint* joint = body->AddFreeJoint();
|
||||
return joint;
|
||||
return &joint->spec;
|
||||
}
|
||||
|
||||
|
||||
@@ -87,21 +95,21 @@ mjmGeom* mjm_addGeom(mjmBody* bodyspec, void* defspec) {
|
||||
|
||||
|
||||
// add camera to body
|
||||
void* mjm_addCamera(mjmBody* bodyspec, void* defspec) {
|
||||
mjmCamera* mjm_addCamera(mjmBody* bodyspec, void* defspec) {
|
||||
mjCDef* def = static_cast<mjCDef*>(defspec);
|
||||
mjCBody* body = reinterpret_cast<mjCBody*>(bodyspec->element);
|
||||
mjCCamera* camera = body->AddCamera(def);
|
||||
return camera;
|
||||
return &camera->spec;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// add light to body
|
||||
void* mjm_addLight(mjmBody* bodyspec, void* defspec) {
|
||||
mjmLight* mjm_addLight(mjmBody* bodyspec, void* defspec) {
|
||||
mjCDef* def = static_cast<mjCDef*>(defspec);
|
||||
mjCBody* body = reinterpret_cast<mjCBody*>(bodyspec->element);
|
||||
mjCLight* light = body->AddLight(def);
|
||||
return light;
|
||||
return &light->spec;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+96
-4
@@ -76,6 +76,42 @@ typedef struct _mjmBody {
|
||||
} mjmBody;
|
||||
|
||||
|
||||
typedef struct _mjmJoint {
|
||||
mjElement element; // compiler only, do not modify
|
||||
mjString name; // name
|
||||
mjString classname; // class name
|
||||
|
||||
// joint properties
|
||||
mjtJoint type; // type of Joint
|
||||
int group; // used for rendering
|
||||
int limited; // does joint have limits: 0 false, 1 true, 2 auto
|
||||
int actfrclimited; // are actuator forces on joints limited: 0 false, 1 true, 2 auto
|
||||
double pos[3]; // anchor position
|
||||
double axis[3]; // joint axis
|
||||
double stiffness; // stiffness coefficient
|
||||
double springdamper[2]; // timeconst, dampratio
|
||||
double range[2]; // joint limits
|
||||
double actfrcrange[2]; // actuator force limits
|
||||
mjtNum solref_limit[mjNREF]; // solver reference: joint limits
|
||||
mjtNum solimp_limit[mjNIMP]; // solver impedance: joint limits
|
||||
mjtNum solref_friction[mjNREF]; // solver reference: dof friction
|
||||
mjtNum solimp_friction[mjNIMP]; // solver impedance: dof friction
|
||||
double margin; // margin value for joint limit detection
|
||||
double ref; // value at reference configuration: qpos0
|
||||
double springref; // spring reference value: qpos_spring
|
||||
mjDouble userdata; // user data
|
||||
|
||||
// dof properties
|
||||
double armature; // armature inertia (mass for slider)
|
||||
double damping; // damping coefficient
|
||||
double frictionloss; // friction loss
|
||||
|
||||
// other attributes
|
||||
mjString info; // message appended to errors
|
||||
double urdfeffort; // store effort field from urdf
|
||||
} mjmJoint;
|
||||
|
||||
|
||||
typedef struct _mjmGeom {
|
||||
mjElement element; // compiler only, do not modify
|
||||
mjString name; // name
|
||||
@@ -131,6 +167,50 @@ typedef struct _mjmSite {
|
||||
} mjmSite;
|
||||
|
||||
|
||||
typedef struct _mjmCamera {
|
||||
mjElement element; // compiler only, do not modify
|
||||
mjString name; // name
|
||||
mjString classname; // class name
|
||||
mjString info; // message appended to errors
|
||||
mjtCamLight mode; // tracking mode
|
||||
mjString targetbody; // target body for orientation
|
||||
double fovy; // y-field of view
|
||||
double ipd; // inter-pupilary distance
|
||||
double pos[3]; // position
|
||||
double quat[4]; // orientation
|
||||
float intrinsic[4]; // camera intrinsics [length]
|
||||
float sensor_size[2]; // sensor size [length]
|
||||
float resolution[2]; // resolution [pixel]
|
||||
float focal_length[2]; // focal length [length]
|
||||
float focal_pixel[2]; // focal length [pixel]
|
||||
float principal_length[2]; // principal point [length]
|
||||
float principal_pixel[2]; // principal point [pixel]
|
||||
mjDouble userdata; // user data
|
||||
mjmOrientation alt; // alternative orientation specification
|
||||
} mjmCamera;
|
||||
|
||||
|
||||
typedef struct _mjmLight {
|
||||
mjElement element; // compiler only, do not modify
|
||||
mjString name; // name
|
||||
mjString classname; // class name
|
||||
mjString info; // message appended to errors
|
||||
mjtCamLight mode; // tracking mode
|
||||
mjString targetbody; // target body for orientation
|
||||
mjtByte directional; // directional light
|
||||
mjtByte castshadow; // does light cast shadows
|
||||
mjtByte active; // is light active
|
||||
double pos[3]; // position
|
||||
double dir[3]; // direction
|
||||
float attenuation[3]; // OpenGL attenuation (quadratic model)
|
||||
float cutoff; // OpenGL cutoff
|
||||
float exponent; // OpenGL exponent
|
||||
float ambient[3]; // ambient color
|
||||
float diffuse[3]; // diffuse color
|
||||
float specular[3]; // specular color
|
||||
} mjmLight;
|
||||
|
||||
|
||||
//---------------------------------- Public API ----------------------------------------------------
|
||||
|
||||
// Create model.
|
||||
@@ -139,6 +219,9 @@ MJAPI void* mjm_createModel();
|
||||
// Delete model.
|
||||
MJAPI void mjm_deleteModel(void* modelspec);
|
||||
|
||||
// Copy spec into private attributes.
|
||||
MJAPI void mjm_finalize(mjElement object);
|
||||
|
||||
// Add child body to body, return child spec.
|
||||
MJAPI mjmBody* mjm_addBody(mjmBody* body, void* defspec);
|
||||
|
||||
@@ -146,19 +229,19 @@ MJAPI mjmBody* mjm_addBody(mjmBody* body, void* defspec);
|
||||
MJAPI mjmSite* mjm_addSite(mjmBody* body, void* defspec);
|
||||
|
||||
// Add joint to body.
|
||||
MJAPI void* mjm_addJoint(mjmBody* body, void* defspec);
|
||||
MJAPI mjmJoint* mjm_addJoint(mjmBody* body, void* defspec);
|
||||
|
||||
// Add freejoint to body.
|
||||
MJAPI void* mjm_addFreeJoint(mjmBody* body);
|
||||
MJAPI mjmJoint* mjm_addFreeJoint(mjmBody* body);
|
||||
|
||||
// Add geom to body.
|
||||
MJAPI mjmGeom* mjm_addGeom(mjmBody* body, void* defspec);
|
||||
|
||||
// Add camera to body.
|
||||
MJAPI void* mjm_addCamera(mjmBody* body, void* defspec);
|
||||
MJAPI mjmCamera* mjm_addCamera(mjmBody* body, void* defspec);
|
||||
|
||||
// Add light to body.
|
||||
MJAPI void* mjm_addLight(mjmBody* body, void* defspec);
|
||||
MJAPI mjmLight* mjm_addLight(mjmBody* body, void* defspec);
|
||||
|
||||
// Add frame to body.
|
||||
MJAPI void* mjm_addFrame(mjmBody* body, void* parentframe);
|
||||
@@ -208,12 +291,21 @@ MJAPI const char* mjm_setFullInertia(mjmBody* body, double quat[4], double inert
|
||||
// Default body attributes.
|
||||
MJAPI void mjm_defaultBody(mjmBody& body);
|
||||
|
||||
// Default joint attributes.
|
||||
MJAPI void mjm_defaultJoint(mjmJoint& joint);
|
||||
|
||||
// Default geom attributes.
|
||||
MJAPI void mjm_defaultGeom(mjmGeom& geom);
|
||||
|
||||
// Default site attributes.
|
||||
MJAPI void mjm_defaultSite(mjmSite& site);
|
||||
|
||||
// Default camera attributes.
|
||||
MJAPI void mjm_defaultCamera(mjmCamera& camera);
|
||||
|
||||
// Default light attributes.
|
||||
MJAPI void mjm_defaultLight(mjmLight& light);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
+28
-28
@@ -116,7 +116,7 @@ bool mjCComposite::AddDefaultJoint(char* error, int error_sz) {
|
||||
return false;
|
||||
} else {
|
||||
mjCDef jnt;
|
||||
jnt.joint.group = 3;
|
||||
jnt.joint.spec.group = 3;
|
||||
defjoint[(mjtCompKind)i].push_back(jnt);
|
||||
}
|
||||
}
|
||||
@@ -457,8 +457,8 @@ bool mjCComposite::MakeParticle(mjCModel* model, mjmBody* body, char* error, int
|
||||
// add slider joints if none defined
|
||||
if (!add[mjCOMPKIND_PARTICLE]) {
|
||||
for (int i=0; i<3; i++) {
|
||||
mjCJoint* jnt = (mjCJoint*)mjm_addJoint(b, &defjoint[mjCOMPKIND_JOINT][0]);
|
||||
jnt->def = (mjCDef*)mjm_getDefault(body->element);
|
||||
mjmJoint* jnt = mjm_addJoint(b, &defjoint[mjCOMPKIND_JOINT][0]);
|
||||
mjm_setDefault(jnt->element, mjm_getDefault(body->element));
|
||||
jnt->type = mjJNT_SLIDE;
|
||||
mjuu_setvec(jnt->pos, 0, 0, 0);
|
||||
mjuu_setvec(jnt->axis, 0, 0, 0);
|
||||
@@ -469,8 +469,8 @@ bool mjCComposite::MakeParticle(mjCModel* model, mjmBody* body, char* error, int
|
||||
// add user-specified joints
|
||||
else {
|
||||
for (auto defjnt : defjoint[mjCOMPKIND_PARTICLE]) {
|
||||
mjCJoint* jnt = (mjCJoint*)mjm_addJoint(b, &defjnt);
|
||||
jnt->def = (mjCDef*)mjm_getDefault(body->element);
|
||||
mjmJoint* jnt = mjm_addJoint(b, &defjnt);
|
||||
mjm_setDefault(jnt->element, mjm_getDefault(body->element));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -626,12 +626,12 @@ bool mjCComposite::MakeGrid(mjCModel* model, mjmBody* body, char* error, int err
|
||||
}
|
||||
|
||||
// add slider joint
|
||||
mjCJoint* jnt[3];
|
||||
mjmJoint* jnt[3];
|
||||
for (int i=0; i<3; i++) {
|
||||
jnt[i] = (mjCJoint*)mjm_addJoint(b, &defjoint[mjCOMPKIND_JOINT][0]);
|
||||
jnt[i]->def = (mjCDef*)mjm_getDefault(body->element);
|
||||
jnt[i] = mjm_addJoint(b, &defjoint[mjCOMPKIND_JOINT][0]);
|
||||
mjm_setDefault(jnt[i]->element, mjm_getDefault(body->element));
|
||||
mju::sprintf_arr(txt, "%sJ%d_%d_%d", prefix.c_str(), i, ix, iy);
|
||||
jnt[i]->name = txt;
|
||||
mjm_setString(jnt[i]->name, txt);
|
||||
jnt[i]->type = mjJNT_SLIDE;
|
||||
mjuu_setvec(jnt[i]->pos, 0, 0, 0);
|
||||
mjuu_setvec(jnt[i]->axis, 0, 0, 0);
|
||||
@@ -853,13 +853,13 @@ mjmBody* mjCComposite::AddCableBody(mjCModel* model, mjmBody* body, int ix, mjtN
|
||||
|
||||
// add curvature joint
|
||||
if (!first || strcmp(initial.c_str(), "none")) {
|
||||
mjCJoint* jnt = (mjCJoint*)mjm_addJoint(body, &defjoint[mjCOMPKIND_JOINT][0]);
|
||||
jnt->def = (mjCDef*)mjm_getDefault(body->element);
|
||||
mjmJoint* jnt = mjm_addJoint(body, &defjoint[mjCOMPKIND_JOINT][0]);
|
||||
mjm_setDefault(jnt->element, mjm_getDefault(body->element));
|
||||
jnt->type = (first && strcmp(initial.c_str(), "free")==0) ? mjJNT_FREE : mjJNT_BALL;
|
||||
jnt->damping = jnt->type==mjJNT_FREE ? 0 : jnt->damping;
|
||||
jnt->armature = jnt->type==mjJNT_FREE ? 0 : jnt->armature;
|
||||
jnt->frictionloss = jnt->type==mjJNT_FREE ? 0 : jnt->frictionloss;
|
||||
jnt->name = this_joint;
|
||||
mjm_setString(jnt->name, this_joint);
|
||||
}
|
||||
|
||||
// exclude contact pair
|
||||
@@ -997,10 +997,10 @@ mjmBody* mjCComposite::AddRopeBody(mjCModel* model, mjmBody* body, int ix, int i
|
||||
// add main joint
|
||||
for (int i=0; i<2; i++) {
|
||||
// add joint
|
||||
mjCJoint* jnt = (mjCJoint*)mjm_addJoint(body, &defjoint[mjCOMPKIND_JOINT][0]);
|
||||
jnt->def = (mjCDef*)mjm_getDefault(body->element);
|
||||
mjmJoint* jnt = mjm_addJoint(body, &defjoint[mjCOMPKIND_JOINT][0]);
|
||||
mjm_setDefault(jnt->element, mjm_getDefault(body->element));
|
||||
mju::sprintf_arr(txt, "%sJ%d_%d", prefix.c_str(), i, ix1);
|
||||
jnt->name = txt;
|
||||
mjm_setString(jnt->name, txt);
|
||||
jnt->type = mjJNT_HINGE;
|
||||
mjuu_setvec(jnt->pos, -0.5*dx, 0, 0);
|
||||
mjuu_setvec(jnt->axis, 0, 0, 0);
|
||||
@@ -1010,10 +1010,10 @@ mjmBody* mjCComposite::AddRopeBody(mjCModel* model, mjmBody* body, int ix, int i
|
||||
// add twist joint
|
||||
if (add[mjCOMPKIND_TWIST]) {
|
||||
// add joint
|
||||
mjCJoint* jnt = (mjCJoint*)mjm_addJoint(body, &defjoint[mjCOMPKIND_TWIST][0]);
|
||||
jnt->def = (mjCDef*)mjm_getDefault(body->element);
|
||||
mjmJoint* jnt = mjm_addJoint(body, &defjoint[mjCOMPKIND_TWIST][0]);
|
||||
mjm_setDefault(jnt->element, mjm_getDefault(body->element));
|
||||
mju::sprintf_arr(txt, "%sJT%d", prefix.c_str(), ix1);
|
||||
jnt->name = txt;
|
||||
mjm_setString(jnt->name, txt);
|
||||
jnt->type = mjJNT_HINGE;
|
||||
mjuu_setvec(jnt->pos, -0.5*dx, 0, 0);
|
||||
mjuu_setvec(jnt->axis, 1, 0, 0);
|
||||
@@ -1022,16 +1022,16 @@ mjmBody* mjCComposite::AddRopeBody(mjCModel* model, mjmBody* body, int ix, int i
|
||||
mjCEquality* eq = model->AddEquality(def + mjCOMPKIND_TWIST);
|
||||
eq->def = model->defaults[0];
|
||||
eq->type = mjEQ_JOINT;
|
||||
eq->name1 = jnt->name;
|
||||
eq->name1 = mjm_getString(jnt->name);
|
||||
}
|
||||
|
||||
// add stretch joint
|
||||
if (add[mjCOMPKIND_STRETCH]) {
|
||||
// add joint
|
||||
mjCJoint* jnt = (mjCJoint*)mjm_addJoint(body, &defjoint[mjCOMPKIND_STRETCH][0]);
|
||||
jnt->def = (mjCDef*)mjm_getDefault(body->element);
|
||||
mjmJoint* jnt = mjm_addJoint(body, &defjoint[mjCOMPKIND_STRETCH][0]);
|
||||
mjm_setDefault(jnt->element, mjm_getDefault(body->element));
|
||||
mju::sprintf_arr(txt, "%sJS%d", prefix.c_str(), ix1);
|
||||
jnt->name = txt;
|
||||
mjm_setString(jnt->name, txt);
|
||||
jnt->type = mjJNT_SLIDE;
|
||||
mjuu_setvec(jnt->pos, -0.5*dx, 0, 0);
|
||||
mjuu_setvec(jnt->axis, 1, 0, 0);
|
||||
@@ -1040,7 +1040,7 @@ mjmBody* mjCComposite::AddRopeBody(mjCModel* model, mjmBody* body, int ix, int i
|
||||
mjCEquality* eq = model->AddEquality(def + mjCOMPKIND_STRETCH);
|
||||
eq->def = model->defaults[0];
|
||||
eq->type = mjEQ_JOINT;
|
||||
eq->name1 = jnt->name;
|
||||
eq->name1 = mjm_getString(jnt->name);
|
||||
}
|
||||
|
||||
return body;
|
||||
@@ -1149,10 +1149,10 @@ bool mjCComposite::MakeBox(mjCModel* model, mjmBody* body, char* error, int erro
|
||||
}
|
||||
|
||||
// add slider joint
|
||||
mjCJoint* jnt = (mjCJoint*)mjm_addJoint(b, &defjoint[mjCOMPKIND_JOINT][0]);
|
||||
jnt->def = (mjCDef*)mjm_getDefault(body->element);
|
||||
mjmJoint* jnt = mjm_addJoint(b, &defjoint[mjCOMPKIND_JOINT][0]);
|
||||
mjm_setDefault(jnt->element, mjm_getDefault(body->element));
|
||||
mju::sprintf_arr(txt, "%sJ%d_%d_%d", prefix.c_str(), ix, iy, iz);
|
||||
jnt->name = txt;
|
||||
mjm_setString(jnt->name, txt);
|
||||
jnt->type = mjJNT_SLIDE;
|
||||
mjuu_setvec(jnt->pos, 0, 0, 0);
|
||||
mjuu_setvec(jnt->axis, 0, 0, 1);
|
||||
@@ -1161,10 +1161,10 @@ bool mjCComposite::MakeBox(mjCModel* model, mjmBody* body, char* error, int erro
|
||||
mjCEquality* eq = model->AddEquality(def + mjCOMPKIND_JOINT);
|
||||
eq->def = model->defaults[0];
|
||||
eq->type = mjEQ_JOINT;
|
||||
eq->name1 = jnt->name;
|
||||
eq->name1 = mjm_getString(jnt->name);
|
||||
|
||||
// add joint to tendon
|
||||
ten->WrapJoint(jnt->name, 1);
|
||||
ten->WrapJoint(std::string(mjm_getString(jnt->name)), 1);
|
||||
|
||||
// add neighbor constraints
|
||||
for (int i=0; i<3; i++) {
|
||||
|
||||
@@ -429,7 +429,7 @@ bool mjCFlexcomp::Make(mjCModel* model, mjmBody* body, char* error, int error_sz
|
||||
|
||||
// add radial slider
|
||||
if (radial) {
|
||||
mjCJoint* jnt = (mjCJoint*)mjm_addJoint(pb, 0);
|
||||
mjmJoint* jnt = mjm_addJoint(pb, 0);
|
||||
|
||||
// set properties
|
||||
jnt->type = mjJNT_SLIDE;
|
||||
@@ -442,7 +442,7 @@ bool mjCFlexcomp::Make(mjCModel* model, mjmBody* body, char* error, int error_sz
|
||||
else {
|
||||
for (int j=0; j<3; j++) {
|
||||
// add joint to body
|
||||
mjCJoint* jnt = (mjCJoint*)mjm_addJoint(pb, 0);
|
||||
mjmJoint* jnt = mjm_addJoint(pb, 0);
|
||||
|
||||
// set properties
|
||||
jnt->type = mjJNT_SLIDE;
|
||||
|
||||
+49
-1
@@ -38,8 +38,23 @@ void mjm_defaultBody(mjmBody& body) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
// default joint attributes
|
||||
void mjm_defaultJoint(mjmJoint& joint) {
|
||||
memset(&joint, 0, sizeof(mjmJoint));
|
||||
joint.type = mjJNT_HINGE;
|
||||
joint.axis[2] = 1;
|
||||
joint.limited = 2;
|
||||
joint.actfrclimited = 2;
|
||||
mj_defaultSolRefImp(joint.solref_limit, joint.solimp_limit);
|
||||
mj_defaultSolRefImp(joint.solref_friction, joint.solimp_friction);
|
||||
joint.urdfeffort = -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// default geom attributes
|
||||
MJAPI void mjm_defaultGeom(mjmGeom& geom) {
|
||||
void mjm_defaultGeom(mjmGeom& geom) {
|
||||
memset(&geom, 0, sizeof(mjmGeom));
|
||||
|
||||
// set non-zero defaults
|
||||
@@ -83,3 +98,36 @@ void mjm_defaultSite(mjmSite& site) {
|
||||
site.rgba[0] = site.rgba[1] = site.rgba[2] = 0.5f;
|
||||
site.rgba[3] = 1.0f;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// default cam attributes
|
||||
void mjm_defaultCamera(mjmCamera& cam) {
|
||||
memset(&cam, 0, sizeof(mjmCamera));
|
||||
cam.mode = mjCAMLIGHT_FIXED;
|
||||
cam.quat[0] = 1;
|
||||
cam.fovy = 45;
|
||||
cam.ipd = 0.068;
|
||||
cam.resolution[0] = cam.resolution[1] = 1;
|
||||
cam.alt.axisangle[0] = cam.alt.xyaxes[0] = cam.alt.zaxis[0] = cam.alt.euler[0] = mjNAN;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// default light attributes
|
||||
void mjm_defaultLight(mjmLight& light) {
|
||||
memset(&light, 0, sizeof(mjmLight));
|
||||
light.mode = mjCAMLIGHT_FIXED;
|
||||
light.directional = 0;
|
||||
light.castshadow = 1;
|
||||
light.active = 1;
|
||||
light.dir[2] = -1;
|
||||
light.attenuation[0] = 1;
|
||||
light.cutoff = 45;
|
||||
light.exponent = 10;
|
||||
light.ambient[0] = light.ambient[1] = light.ambient[2] = 0;
|
||||
light.diffuse[0] = light.diffuse[1] = light.diffuse[2] = 0.7;
|
||||
light.specular[0] = light.specular[1] = light.specular[2] = 0.3;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -565,7 +565,7 @@ mjCDef* mjCModel::AddDef(string name, int parentid) {
|
||||
if (parentid>=0 && parentid<thisid) {
|
||||
*def = *defaults[parentid];
|
||||
defaults[parentid]->childid.push_back(thisid);
|
||||
def->MakePointerLocal();
|
||||
def->PointToLocal();
|
||||
}
|
||||
def->parentid = parentid;
|
||||
def->name = name;
|
||||
@@ -1573,7 +1573,7 @@ void mjCModel::CopyTree(mjModel* m) {
|
||||
copyvec(m->jnt_solref+mjNREF*jid, pj->solref_limit, mjNREF);
|
||||
copyvec(m->jnt_solimp+mjNIMP*jid, pj->solimp_limit, mjNIMP);
|
||||
m->jnt_margin[jid] = (mjtNum)pj->margin;
|
||||
copyvec(m->jnt_user+nuser_jnt*jid, pj->userdata.data(), nuser_jnt);
|
||||
copyvec(m->jnt_user+nuser_jnt*jid, pj->get_userdata().data(), nuser_jnt);
|
||||
|
||||
// not simple if: rotation already found, or pos not zero, or mis-aligned axis
|
||||
if (rotfound ||
|
||||
@@ -1756,7 +1756,7 @@ void mjCModel::CopyTree(mjModel* m) {
|
||||
copyvec(m->cam_resolution+2*cid, pc->resolution, 2);
|
||||
copyvec(m->cam_sensorsize+2*cid, pc->sensor_size, 2);
|
||||
copyvec(m->cam_intrinsic+4*cid, pc->intrinsic, 4);
|
||||
copyvec(m->cam_user+nuser_cam*cid, pc->userdata.data(), nuser_cam);
|
||||
copyvec(m->cam_user+nuser_cam*cid, pc->get_userdata().data(), nuser_cam);
|
||||
}
|
||||
|
||||
// loop over lights for this body
|
||||
@@ -2890,7 +2890,7 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) {
|
||||
if (nuser_jnt == -1) {
|
||||
nuser_jnt = 0;
|
||||
for (int i=0; i<joints.size(); i++) {
|
||||
nuser_jnt = mjMAX(nuser_jnt, joints[i]->userdata.size());
|
||||
nuser_jnt = mjMAX(nuser_jnt, joints[i]->spec_userdata_.size());
|
||||
}
|
||||
}
|
||||
if (nuser_geom == -1) {
|
||||
@@ -2908,7 +2908,7 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) {
|
||||
if (nuser_cam == -1) {
|
||||
nuser_cam = 0;
|
||||
for (int i=0; i<cameras.size(); i++) {
|
||||
nuser_cam = mjMAX(nuser_cam, cameras[i]->userdata.size());
|
||||
nuser_cam = mjMAX(nuser_cam, cameras[i]->spec_userdata_.size());
|
||||
}
|
||||
}
|
||||
if (nuser_tendon == -1) {
|
||||
@@ -3341,7 +3341,7 @@ bool mjCModel::CopyBack(const mjModel* m) {
|
||||
pj->margin = (double)m->jnt_margin[i];
|
||||
|
||||
if (nuser_jnt) {
|
||||
copyvec(pj->userdata.data(), m->jnt_user + nuser_jnt*i, nuser_jnt);
|
||||
copyvec(pj->userdata_.data(), m->jnt_user + nuser_jnt*i, nuser_jnt);
|
||||
}
|
||||
|
||||
// dof data
|
||||
@@ -3422,7 +3422,7 @@ bool mjCModel::CopyBack(const mjModel* m) {
|
||||
copyvec(cameras[i]->intrinsic, m->cam_intrinsic+4*i, 4);
|
||||
|
||||
if (nuser_cam) {
|
||||
copyvec(cameras[i]->userdata.data(), m->cam_user + nuser_cam*i, nuser_cam);
|
||||
copyvec(cameras[i]->userdata_.data(), m->cam_user + nuser_cam*i, nuser_cam);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+132
-86
@@ -470,10 +470,10 @@ mjCDef::mjCDef(void) {
|
||||
// compiler
|
||||
void mjCDef::Compile(const mjCModel* model) {
|
||||
// enforce length of all default userdata arrays
|
||||
joint.userdata.resize(model->nuser_jnt);
|
||||
joint.userdata_.resize(model->nuser_jnt);
|
||||
geom.userdata_.resize(model->nuser_geom);
|
||||
site.userdata_.resize(model->nuser_site);
|
||||
camera.userdata.resize(model->nuser_cam);
|
||||
camera.userdata_.resize(model->nuser_cam);
|
||||
tendon.userdata.resize(model->nuser_tendon);
|
||||
actuator.userdata.resize(model->nuser_actuator);
|
||||
}
|
||||
@@ -481,8 +481,11 @@ void mjCDef::Compile(const mjCModel* model) {
|
||||
|
||||
|
||||
// assignment operator (TODO: use overloading)
|
||||
void mjCDef::MakePointerLocal() {
|
||||
geom.MakePointerLocal();
|
||||
void mjCDef::PointToLocal() {
|
||||
joint.PointToLocal();
|
||||
geom.PointToLocal();
|
||||
site.PointToLocal();
|
||||
camera.PointToLocal();
|
||||
}
|
||||
|
||||
|
||||
@@ -581,16 +584,21 @@ mjCBody::mjCBody(mjCModel* _model) {
|
||||
lights.clear();
|
||||
spec_userdata_.clear();
|
||||
|
||||
// point to local
|
||||
// in case this body is not compiled
|
||||
CopyFromSpec();
|
||||
|
||||
// point to local (needs to be after defaults)
|
||||
PointToLocal();
|
||||
}
|
||||
|
||||
|
||||
void mjCBody::PointToLocal() {
|
||||
spec.element = (mjElement)this;
|
||||
spec.name = (mjString)&name;
|
||||
spec.classname = (mjString)&classname;
|
||||
spec.userdata = (mjDouble)&spec_userdata_;
|
||||
spec.plugin.name = (mjString)&plugin_name;
|
||||
spec.plugin.instance_name = (mjString)&plugin_instance_name;
|
||||
|
||||
// in case this body is not compiled
|
||||
CopyFromSpec();
|
||||
}
|
||||
|
||||
|
||||
@@ -664,7 +672,7 @@ mjCFrame* mjCBody::AddFrame(mjCFrame* _frame) {
|
||||
mjCJoint* mjCBody::AddFreeJoint() {
|
||||
// create free joint, don't inherit from defaults
|
||||
mjCJoint* obj = new mjCJoint(model, NULL);
|
||||
obj->type = mjJNT_FREE;
|
||||
obj->spec.type = mjJNT_FREE;
|
||||
|
||||
// set body pointer, add
|
||||
obj->body = this;
|
||||
@@ -1200,56 +1208,59 @@ void mjCFrame::Compile() {
|
||||
|
||||
// initialize default joint
|
||||
mjCJoint::mjCJoint(mjCModel* _model, mjCDef* _def) {
|
||||
// joint defaults
|
||||
type = mjJNT_HINGE;
|
||||
group = 0;
|
||||
mjuu_setvec(pos, 0, 0, 0);
|
||||
mjuu_setvec(axis, 0, 0, 1);
|
||||
limited = 2;
|
||||
actfrclimited = 2;
|
||||
stiffness = 0;
|
||||
range[0] = 0;
|
||||
range[1] = 0;
|
||||
actfrcrange[0] = 0;
|
||||
actfrcrange[1] = 0;
|
||||
springdamper[0] = 0;
|
||||
springdamper[1] = 0;
|
||||
mj_defaultSolRefImp(solref_limit, solimp_limit);
|
||||
mj_defaultSolRefImp(solref_friction, solimp_friction);
|
||||
margin = 0;
|
||||
ref = 0;
|
||||
springref = 0;
|
||||
userdata.clear();
|
||||
|
||||
// dof defaults
|
||||
armature = 0;
|
||||
frictionloss = 0;
|
||||
damping = 0;
|
||||
mjm_defaultJoint(spec);
|
||||
|
||||
// clear internal variables
|
||||
spec_userdata_.clear();
|
||||
body = 0;
|
||||
urdfeffort = -1;
|
||||
|
||||
// reset to default if given
|
||||
if (_def) {
|
||||
_def->joint.CopyFromSpec();
|
||||
*this = _def->joint;
|
||||
}
|
||||
|
||||
// set model, def
|
||||
model = _model;
|
||||
def = (_def ? _def : (_model ? _model->defaults[0] : 0));
|
||||
|
||||
// point to local (needs to be after defaults)
|
||||
PointToLocal();
|
||||
|
||||
// in case this joint is not compiled
|
||||
CopyFromSpec();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void mjCJoint::PointToLocal() {
|
||||
spec.element = (mjElement)this;
|
||||
spec.name = (mjString)&name;
|
||||
spec.classname = (mjString)&classname;
|
||||
spec.userdata = (mjDouble)&spec_userdata_;
|
||||
spec.info = (mjString)&info;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void mjCJoint::CopyFromSpec() {
|
||||
*static_cast<mjmJoint*>(this) = spec;
|
||||
userdata_ = spec_userdata_;
|
||||
userdata = (mjDouble)&spec_userdata_;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// compiler
|
||||
int mjCJoint::Compile(void) {
|
||||
CopyFromSpec();
|
||||
|
||||
// resize userdata
|
||||
if (userdata.size() > model->nuser_jnt) {
|
||||
if (userdata_.size() > model->nuser_jnt) {
|
||||
throw mjCError(this, "user has more values than nuser_jnt in joint '%s' (id = %d)",
|
||||
name.c_str(), id);
|
||||
}
|
||||
userdata.resize(model->nuser_jnt);
|
||||
userdata_.resize(model->nuser_jnt);
|
||||
|
||||
// check springdamper
|
||||
if (springdamper[0] || springdamper[1]) {
|
||||
@@ -1405,7 +1416,7 @@ mjCGeom::mjCGeom(mjCModel* _model, mjCDef* _def) {
|
||||
def = (_def ? _def : (_model ? _model->defaults[0] : 0));
|
||||
|
||||
// point to local (needs to be after defaults)
|
||||
MakePointerLocal();
|
||||
PointToLocal();
|
||||
|
||||
// in case this geom is not compiled
|
||||
CopyFromSpec();
|
||||
@@ -1414,7 +1425,7 @@ mjCGeom::mjCGeom(mjCModel* _model, mjCDef* _def) {
|
||||
|
||||
|
||||
// to be called after any default copy constructor
|
||||
void mjCGeom::MakePointerLocal(void) {
|
||||
void mjCGeom::PointToLocal(void) {
|
||||
spec.element = (mjElement)this;
|
||||
spec.name = (mjString)&name;
|
||||
spec.info = (mjString)&info;
|
||||
@@ -2001,20 +2012,26 @@ mjCSite::mjCSite(mjCModel* _model, mjCDef* _def) {
|
||||
*this = _def->site;
|
||||
}
|
||||
|
||||
// point to local, not to default
|
||||
// point to local (needs to be after defaults)
|
||||
PointToLocal();
|
||||
|
||||
// in case this site is not compiled
|
||||
CopyFromSpec();
|
||||
|
||||
// set model, def
|
||||
model = _model;
|
||||
def = (_def ? _def : (_model ? _model->defaults[0] : 0));
|
||||
}
|
||||
|
||||
|
||||
|
||||
void mjCSite::PointToLocal() {
|
||||
spec.element = (mjElement)this;
|
||||
spec.name = (mjString)&name;
|
||||
spec.info = (mjString)&info;
|
||||
spec.classname = (mjString)&classname;
|
||||
spec.material = (mjString)&spec_material_;
|
||||
spec.userdata = (mjDouble)&spec_userdata_;
|
||||
|
||||
// initialize private attributes in case object won't be compiled
|
||||
CopyFromSpec();
|
||||
|
||||
// set model, def
|
||||
model = _model;
|
||||
def = (_def ? _def : (_model ? _model->defaults[0] : 0));
|
||||
}
|
||||
|
||||
|
||||
@@ -2124,49 +2141,70 @@ void mjCSite::Compile(void) {
|
||||
|
||||
// initialize defaults
|
||||
mjCCamera::mjCCamera(mjCModel* _model, mjCDef* _def) {
|
||||
// set defaults
|
||||
mode = mjCAMLIGHT_FIXED;
|
||||
targetbody.clear();
|
||||
mjuu_setvec(pos, 0, 0, 0);
|
||||
mjuu_setvec(quat, 1, 0, 0, 0);
|
||||
fovy = 45;
|
||||
ipd = 0.068;
|
||||
userdata.clear();
|
||||
resolution[0] = resolution[1] = 1;
|
||||
principal_length[0] = principal_length[1] = 0;
|
||||
principal_pixel[0] = principal_pixel[1] = 0;
|
||||
focal_length[0] = focal_length[1] = 0;
|
||||
focal_pixel[0] = focal_pixel[1] = 0;
|
||||
sensor_size[0] = sensor_size[1] = 0;
|
||||
mjuu_setvec(intrinsic, 0, 0, 0, 0);
|
||||
mjm_defaultCamera(spec);
|
||||
|
||||
// clear private variables
|
||||
body = 0;
|
||||
targetbodyid = -1;
|
||||
spec_targetbody_.clear();
|
||||
|
||||
// reset to default if given
|
||||
if (_def) {
|
||||
_def->camera.CopyFromSpec();
|
||||
*this = _def->camera;
|
||||
}
|
||||
|
||||
// set model, def
|
||||
model = _model;
|
||||
def = (_def ? _def : (_model ? _model->defaults[0] : 0));
|
||||
|
||||
// point to local (needs to be after defaults)
|
||||
PointToLocal();
|
||||
|
||||
// in case this camera is not compiled
|
||||
CopyFromSpec();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void mjCCamera::PointToLocal() {
|
||||
spec.element = (mjElement)this;
|
||||
spec.name = (mjString)&name;
|
||||
spec.classname = (mjString)&classname;
|
||||
spec.userdata = (mjDouble)&spec_userdata_;
|
||||
spec.targetbody = (mjString)&spec_targetbody_;
|
||||
spec.info = (mjString)&info;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void mjCCamera::CopyFromSpec() {
|
||||
*static_cast<mjmCamera*>(this) = spec;
|
||||
userdata_ = spec_userdata_;
|
||||
targetbody_ = spec_targetbody_;
|
||||
userdata = (mjDouble)&userdata_;
|
||||
targetbody = (mjString)&targetbody_;
|
||||
mju_copy4(alt_.axisangle, alt.axisangle);
|
||||
mju_copy(alt_.xyaxes, alt.xyaxes, 6);
|
||||
mju_copy3(alt_.zaxis, alt.zaxis);
|
||||
mju_copy3(alt_.euler, alt.euler);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// compiler
|
||||
void mjCCamera::Compile(void) {
|
||||
CopyFromSpec();
|
||||
|
||||
// resize userdata
|
||||
if (userdata.size() > model->nuser_cam) {
|
||||
if (userdata_.size() > model->nuser_cam) {
|
||||
throw mjCError(this, "user has more values than nuser_cam in camera '%s' (id = %d)",
|
||||
name.c_str(), id);
|
||||
}
|
||||
userdata.resize(model->nuser_cam);
|
||||
userdata_.resize(model->nuser_cam);
|
||||
|
||||
// process orientation specifications
|
||||
const char* err = alt.Set(quat, model->degree, model->euler);
|
||||
const char* err = alt_.Set(quat, model->degree, model->euler);
|
||||
if (err) {
|
||||
throw mjCError(this, "orientation specification error '%s' in camera %d", err, id);
|
||||
}
|
||||
@@ -2180,8 +2218,8 @@ void mjCCamera::Compile(void) {
|
||||
mjuu_normvec(quat, 4);
|
||||
|
||||
// get targetbodyid
|
||||
if (!targetbody.empty()) {
|
||||
mjCBody* tb = (mjCBody*)model->FindObject(mjOBJ_BODY, targetbody);
|
||||
if (!targetbody_.empty()) {
|
||||
mjCBody* tb = (mjCBody*)model->FindObject(mjOBJ_BODY, targetbody_);
|
||||
if (tb) {
|
||||
targetbodyid = tb->id;
|
||||
} else {
|
||||
@@ -2240,39 +2278,47 @@ void mjCCamera::Compile(void) {
|
||||
|
||||
// initialize defaults
|
||||
mjCLight::mjCLight(mjCModel* _model, mjCDef* _def) {
|
||||
// set defaults
|
||||
mode = mjCAMLIGHT_FIXED;
|
||||
targetbody.clear();
|
||||
directional = false;
|
||||
castshadow = true;
|
||||
active = true;
|
||||
mjuu_setvec(pos, 0, 0, 0);
|
||||
mjuu_setvec(dir, 0, 0, -1);
|
||||
mjuu_setvec(attenuation, 1, 0, 0);
|
||||
cutoff = 45;
|
||||
exponent = 10;
|
||||
ambient[0] = ambient[1] = ambient[2] = 0;
|
||||
diffuse[0] = diffuse[1] = diffuse[2] = 0.7;
|
||||
specular[0] = specular[1] = specular[2] = 0.3;
|
||||
mjm_defaultLight(spec);
|
||||
|
||||
// clear private variables
|
||||
body = 0;
|
||||
targetbodyid = -1;
|
||||
spec_targetbody_.clear();
|
||||
|
||||
// reset to default if given
|
||||
if (_def) {
|
||||
_def->light.CopyFromSpec();
|
||||
*this = _def->light;
|
||||
}
|
||||
|
||||
// set model, def
|
||||
model = _model;
|
||||
def = (_def ? _def : (_model ? _model->defaults[0] : 0));
|
||||
|
||||
// point to local
|
||||
spec.element = (mjElement)this;
|
||||
spec.name = (mjString)&name;
|
||||
spec.classname = (mjString)&classname;
|
||||
spec.targetbody = (mjString)&spec_targetbody_;
|
||||
spec.info = (mjString)&info;
|
||||
|
||||
CopyFromSpec();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void mjCLight::CopyFromSpec() {
|
||||
*static_cast<mjmLight*>(this) = spec;
|
||||
targetbody_ = spec_targetbody_;
|
||||
targetbody = (mjString)&targetbody_;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// compiler
|
||||
void mjCLight::Compile(void) {
|
||||
CopyFromSpec();
|
||||
|
||||
double quat[4]= {1, 0, 0, 0};
|
||||
|
||||
// frame
|
||||
@@ -2286,8 +2332,8 @@ void mjCLight::Compile(void) {
|
||||
}
|
||||
|
||||
// get targetbodyid
|
||||
if (!targetbody.empty()) {
|
||||
mjCBody* tb = (mjCBody*)model->FindObject(mjOBJ_BODY, targetbody);
|
||||
if (!targetbody_.empty()) {
|
||||
mjCBody* tb = (mjCBody*)model->FindObject(mjOBJ_BODY, targetbody_);
|
||||
if (tb) {
|
||||
targetbodyid = tb->id;
|
||||
} else {
|
||||
@@ -4077,9 +4123,9 @@ void mjCActuator::Compile(void) {
|
||||
pjnt = (mjCJoint*) ptarget;
|
||||
|
||||
// apply urdfeffort
|
||||
if (pjnt->urdfeffort>0) {
|
||||
forcerange[0] = -pjnt->urdfeffort;
|
||||
forcerange[1] = pjnt->urdfeffort;
|
||||
if (pjnt->spec.urdfeffort>0) {
|
||||
forcerange[0] = -pjnt->spec.urdfeffort;
|
||||
forcerange[1] = pjnt->spec.urdfeffort;
|
||||
forcelimited = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
+49
-59
@@ -180,6 +180,9 @@ class mjCBase {
|
||||
// Add frame transformation
|
||||
void SetFrame(mjCFrame* _frame);
|
||||
|
||||
// Copy spec into private attributes
|
||||
virtual void CopyFromSpec() {}
|
||||
|
||||
std::string name; // object name
|
||||
std::string classname; // defaults class name
|
||||
int id; // object id
|
||||
@@ -194,6 +197,7 @@ class mjCBase {
|
||||
std::string plugin_instance_name;
|
||||
protected:
|
||||
mjCBase(); // constructor
|
||||
virtual ~mjCBase() = default; // destructor
|
||||
};
|
||||
|
||||
|
||||
@@ -289,6 +293,7 @@ class mjCBody : public mjCBase, private mjmBody {
|
||||
std::vector<mjCLight*> lights; // lights attached to this body
|
||||
|
||||
void CopyFromSpec(); // copy spec into attributes
|
||||
void PointToLocal(void);
|
||||
|
||||
// variable-size data
|
||||
std::vector<double> userdata_;
|
||||
@@ -322,48 +327,36 @@ class mjCFrame : public mjCBase {
|
||||
//------------------------- class mjCJoint ---------------------------------------------------------
|
||||
// Describes a motion degree of freedom of a body relative to its parent
|
||||
|
||||
class mjCJoint : public mjCBase {
|
||||
class mjCJoint : public mjCBase, private mjmJoint {
|
||||
friend class mjCDef;
|
||||
friend class mjCEquality;
|
||||
friend class mjCBody;
|
||||
friend class mjCModel;
|
||||
friend class mjCSensor;
|
||||
friend class mjXWriter;
|
||||
friend class mjXURDF;
|
||||
|
||||
public:
|
||||
// variables set by user: joint properties
|
||||
mjtJoint type; // type of Joint
|
||||
int group; // used for rendering
|
||||
int limited; // does joint have limits: 0 false, 1 true, 2 auto
|
||||
int actfrclimited; // are actuator forces on joints limited: 0 false, 1 true, 2 auto
|
||||
double pos[3]; // anchor position
|
||||
double axis[3]; // joint axis
|
||||
double stiffness; // stiffness coefficient
|
||||
double springdamper[2]; // timeconst, dampratio
|
||||
double range[2]; // joint limits
|
||||
double actfrcrange[2]; // actuator force limits
|
||||
mjtNum solref_limit[mjNREF]; // solver reference: joint limits
|
||||
mjtNum solimp_limit[mjNIMP]; // solver impedance: joint limits
|
||||
mjtNum solref_friction[mjNREF]; // solver reference: dof friction
|
||||
mjtNum solimp_friction[mjNIMP]; // solver impedance: dof friction
|
||||
double margin; // margin value for joint limit detection
|
||||
double ref; // value at reference configuration: qpos0
|
||||
double springref; // spring reference value: qpos_spring
|
||||
std::vector<double> userdata; // user data
|
||||
mjmJoint spec;
|
||||
using mjCBase::name;
|
||||
using mjCBase::classname;
|
||||
using mjCBase::info;
|
||||
|
||||
// variables set by user: dof properties
|
||||
double armature; // armature inertia (mass for slider)
|
||||
double damping; // damping coefficient
|
||||
double frictionloss; // friction loss
|
||||
void CopyFromSpec(void);
|
||||
|
||||
double urdfeffort; // store effort field from urdf
|
||||
// used by mjXWriter and mjCModel
|
||||
const std::vector<double>& get_userdata() { return userdata_; }
|
||||
|
||||
private:
|
||||
mjCJoint(mjCModel* = 0, mjCDef* = 0);
|
||||
|
||||
int Compile(void); // compiler; return dofnum
|
||||
void PointToLocal(void);
|
||||
|
||||
mjCBody* body; // joint's body
|
||||
// variable-size data
|
||||
std::vector<double> userdata_;
|
||||
std::vector<double> spec_userdata_;
|
||||
};
|
||||
|
||||
|
||||
@@ -412,7 +405,7 @@ class mjCGeom : public mjCBase, private mjmGeom {
|
||||
double GetRBound(void); // compute bounding sphere radius
|
||||
void ComputeAABB(void); // compute axis-aligned bounding box
|
||||
void CopyFromSpec(void);
|
||||
void MakePointerLocal(void);
|
||||
void PointToLocal(void);
|
||||
|
||||
mjCAlternative alt_;
|
||||
bool visual_; // true: geom does not collide and is unreferenced
|
||||
@@ -470,6 +463,7 @@ class mjCSite : public mjCBase, private mjmSite {
|
||||
mjCSite(mjCModel* = 0, mjCDef* = 0); // constructor
|
||||
void Compile(void); // compiler
|
||||
void CopyFromSpec(); // copy spec into attributes
|
||||
void PointToLocal(void);
|
||||
|
||||
mjCAlternative alt_;
|
||||
|
||||
@@ -489,36 +483,36 @@ class mjCSite : public mjCBase, private mjmSite {
|
||||
//------------------------- class mjCCamera --------------------------------------------------------
|
||||
// Describes a camera, attached to a body
|
||||
|
||||
class mjCCamera : public mjCBase {
|
||||
class mjCCamera : public mjCBase, private mjmCamera {
|
||||
friend class mjCDef;
|
||||
friend class mjCBody;
|
||||
friend class mjCModel;
|
||||
friend class mjCSensor;
|
||||
friend class mjXWriter;
|
||||
|
||||
public:
|
||||
// variables set by user
|
||||
mjtCamLight mode; // tracking mode
|
||||
std::string targetbody; // target body for orientation
|
||||
double fovy; // y-field of view
|
||||
double ipd; // inter-pupilary distance
|
||||
double pos[3]; // position
|
||||
double quat[4]; // orientation
|
||||
float intrinsic[4]; // camera intrinsics [length]
|
||||
float sensor_size[2]; // sensor size [length]
|
||||
float resolution[2]; // resolution [pixel]
|
||||
float focal_length[2]; // focal length [length]
|
||||
float focal_pixel[2]; // focal length [pixel]
|
||||
float principal_length[2]; // principal point [length]
|
||||
float principal_pixel[2]; // principal point [pixel]
|
||||
std::vector<double> userdata; // user data
|
||||
mjCAlternative alt; // alternative orientation specification
|
||||
mjmCamera spec;
|
||||
using mjCBase::name;
|
||||
using mjCBase::classname;
|
||||
using mjCBase::info;
|
||||
|
||||
// used by mjXWriter and mjCModel
|
||||
const std::string& get_targetbody() { return targetbody_; }
|
||||
const std::vector<double>& get_userdata() { return userdata_; }
|
||||
|
||||
private:
|
||||
mjCCamera(mjCModel* = 0, mjCDef* = 0); // constructor
|
||||
void Compile(void); // compiler
|
||||
void CopyFromSpec(void);
|
||||
void PointToLocal(void);
|
||||
|
||||
mjCBody* body; // camera's body
|
||||
int targetbodyid; // id of target body; -1: none
|
||||
mjCAlternative alt_;
|
||||
std::string targetbody_;
|
||||
std::string spec_targetbody_;
|
||||
std::vector<double> userdata_;
|
||||
std::vector<double> spec_userdata_;
|
||||
};
|
||||
|
||||
|
||||
@@ -526,34 +520,30 @@ class mjCCamera : public mjCBase {
|
||||
//------------------------- class mjCLight ---------------------------------------------------------
|
||||
// Describes a light, attached to a body
|
||||
|
||||
class mjCLight : public mjCBase {
|
||||
class mjCLight : public mjCBase, private mjmLight {
|
||||
friend class mjCDef;
|
||||
friend class mjCBody;
|
||||
friend class mjCModel;
|
||||
friend class mjXWriter;
|
||||
|
||||
public:
|
||||
// variables set by user
|
||||
mjtCamLight mode; // tracking mode
|
||||
std::string targetbody; // target body for orientation
|
||||
bool directional; // directional light
|
||||
bool castshadow; // does light cast shadows
|
||||
bool active; // is light active
|
||||
double pos[3]; // position
|
||||
double dir[3]; // direction
|
||||
float attenuation[3]; // OpenGL attenuation (quadratic model)
|
||||
float cutoff; // OpenGL cutoff
|
||||
float exponent; // OpenGL exponent
|
||||
float ambient[3]; // ambient color
|
||||
float diffuse[3]; // diffuse color
|
||||
float specular[3]; // specular color
|
||||
mjmLight spec;
|
||||
using mjCBase::name;
|
||||
using mjCBase::classname;
|
||||
using mjCBase::info;
|
||||
|
||||
// used by mjXWriter and mjCModel
|
||||
const std::string& get_targetbody() { return targetbody_; }
|
||||
|
||||
private:
|
||||
mjCLight(mjCModel* = 0, mjCDef* = 0); // constructor
|
||||
void Compile(void); // compiler
|
||||
void CopyFromSpec(void);
|
||||
|
||||
mjCBody* body; // light's body
|
||||
int targetbodyid; // id of target body; -1: none
|
||||
std::string targetbody_;
|
||||
std::string spec_targetbody_;
|
||||
};
|
||||
|
||||
|
||||
@@ -1314,7 +1304,7 @@ class mjCDef {
|
||||
public:
|
||||
mjCDef(void); // constructor
|
||||
void Compile(const mjCModel* model); // compiler
|
||||
void MakePointerLocal();
|
||||
void PointToLocal();
|
||||
|
||||
// identifiers
|
||||
std::string name; // class name
|
||||
|
||||
+103
-63
@@ -1465,13 +1465,18 @@ void mjXReader::OneMaterial(XMLElement* elem, mjCMaterial* pmat) {
|
||||
|
||||
|
||||
// joint element parser
|
||||
void mjXReader::OneJoint(XMLElement* elem, mjCJoint* pjoint) {
|
||||
string text;
|
||||
void mjXReader::OneJoint(XMLElement* elem, mjmJoint* pjoint) {
|
||||
string text, name, classname;
|
||||
std::vector<double> userdata;
|
||||
int n;
|
||||
|
||||
// read attributes
|
||||
ReadAttrTxt(elem, "name", pjoint->name);
|
||||
ReadAttrTxt(elem, "class", pjoint->classname);
|
||||
if (ReadAttrTxt(elem, "name", name)) {
|
||||
mjm_setString(pjoint->name, name.c_str());
|
||||
}
|
||||
if (ReadAttrTxt(elem, "class", classname)) {
|
||||
mjm_setString(pjoint->classname, classname.c_str());
|
||||
}
|
||||
if (MapValue(elem, "type", &n, joint_map, joint_sz)) {
|
||||
pjoint->type = (mjtJoint)n;
|
||||
}
|
||||
@@ -1496,9 +1501,13 @@ void mjXReader::OneJoint(XMLElement* elem, mjCJoint* pjoint) {
|
||||
ReadAttr(elem, "frictionloss", 1, &pjoint->frictionloss, text);
|
||||
|
||||
// read userdata
|
||||
ReadVector(elem, "user", pjoint->userdata, text);
|
||||
if (ReadVector(elem, "user", userdata, text)) {
|
||||
mjm_setDouble(pjoint->userdata, userdata.data(), userdata.size());
|
||||
}
|
||||
|
||||
GetXMLPos(elem, pjoint);
|
||||
// write error info
|
||||
mjm_setString(pjoint->info,
|
||||
std::string("line = " + std::to_string(elem->GetLineNum()) + ", column = -1").c_str());
|
||||
}
|
||||
|
||||
|
||||
@@ -1572,6 +1581,7 @@ void mjXReader::OneGeom(XMLElement* elem, mjmGeom* pgeom) {
|
||||
pgeom->typeinertia = (mjtGeomInertia)n;
|
||||
}
|
||||
|
||||
// write error info
|
||||
mjm_setString(pgeom->info,
|
||||
std::string("line = " + std::to_string(elem->GetLineNum()) + ", column = -1").c_str());
|
||||
}
|
||||
@@ -1586,8 +1596,12 @@ void mjXReader::OneSite(XMLElement* elem, mjmSite& site) {
|
||||
std::string material;
|
||||
|
||||
// read attributes
|
||||
ReadAttrTxt(elem, "name", name);
|
||||
ReadAttrTxt(elem, "class", classname);
|
||||
if (ReadAttrTxt(elem, "name", name)) {
|
||||
mjm_setString(site.name, name.c_str());
|
||||
}
|
||||
if (ReadAttrTxt(elem, "class", classname)) {
|
||||
mjm_setString(site.classname, classname.c_str());
|
||||
}
|
||||
if (MapValue(elem, "type", &n, geom_map, mjNGEOMTYPES)) {
|
||||
site.type = (mjtGeom)n;
|
||||
}
|
||||
@@ -1595,21 +1609,17 @@ void mjXReader::OneSite(XMLElement* elem, mjmSite& site) {
|
||||
ReadAttrInt(elem, "group", &site.group);
|
||||
ReadAttr(elem, "pos", 3, site.pos, text);
|
||||
ReadQuat(elem, "quat", site.quat, text);
|
||||
ReadAttrTxt(elem, "material", material);
|
||||
if (ReadAttrTxt(elem, "material", material)) {
|
||||
mjm_setString(site.material, material.c_str());
|
||||
}
|
||||
ReadAttr(elem, "rgba", 4, site.rgba, text);
|
||||
ReadAttr(elem, "fromto", 6, site.fromto, text);
|
||||
ReadAlternative(elem, site.alt);
|
||||
ReadVector(elem, "user", userdata, text);
|
||||
if (ReadVector(elem, "user", userdata, text)) {
|
||||
mjm_setDouble(site.userdata, userdata.data(), userdata.size());
|
||||
}
|
||||
|
||||
// set strings
|
||||
mjm_setString(site.name, name.c_str());
|
||||
mjm_setString(site.classname, classname.c_str());
|
||||
mjm_setString(site.material, material.c_str());
|
||||
|
||||
// set pointers
|
||||
mjm_setDouble(site.userdata, userdata.data(), userdata.size());
|
||||
|
||||
// set info
|
||||
// write error info
|
||||
mjm_setString(site.info,
|
||||
std::string("line = " + std::to_string(elem->GetLineNum()) + ", column = -1").c_str());
|
||||
}
|
||||
@@ -1617,14 +1627,21 @@ void mjXReader::OneSite(XMLElement* elem, mjmSite& site) {
|
||||
|
||||
|
||||
// camera element parser
|
||||
void mjXReader::OneCamera(XMLElement* elem, mjCCamera* pcam) {
|
||||
void mjXReader::OneCamera(XMLElement* elem, mjmCamera* pcam) {
|
||||
int n;
|
||||
string text;
|
||||
string text, name, classname, targetbody;
|
||||
std::vector<double> userdata;
|
||||
|
||||
// read attributes
|
||||
ReadAttrTxt(elem, "name", pcam->name);
|
||||
ReadAttrTxt(elem, "class", pcam->classname);
|
||||
ReadAttrTxt(elem, "target", pcam->targetbody);
|
||||
if (ReadAttrTxt(elem, "name", name)) {
|
||||
mjm_setString(pcam->name, name.c_str());
|
||||
}
|
||||
if (ReadAttrTxt(elem, "class", classname)) {
|
||||
mjm_setString(pcam->classname, classname.c_str());
|
||||
}
|
||||
if (ReadAttrTxt(elem, "target", targetbody)) {
|
||||
mjm_setString(pcam->targetbody, targetbody.c_str());
|
||||
}
|
||||
if (MapValue(elem, "mode", &n, camlight_map, camlight_sz)) {
|
||||
pcam->mode = (mjtCamLight)n;
|
||||
}
|
||||
@@ -1654,22 +1671,31 @@ void mjXReader::OneCamera(XMLElement* elem, mjCCamera* pcam) {
|
||||
}
|
||||
|
||||
// read userdata
|
||||
ReadVector(elem, "user", pcam->userdata, text);
|
||||
ReadVector(elem, "user", userdata, text);
|
||||
mjm_setDouble(pcam->userdata, userdata.data(), userdata.size());
|
||||
|
||||
GetXMLPos(elem, pcam);
|
||||
// write error info
|
||||
mjm_setString(pcam->info,
|
||||
std::string("line = " + std::to_string(elem->GetLineNum()) + ", column = -1").c_str());
|
||||
}
|
||||
|
||||
|
||||
|
||||
// light element parser
|
||||
void mjXReader::OneLight(XMLElement* elem, mjCLight* plight) {
|
||||
void mjXReader::OneLight(XMLElement* elem, mjmLight* plight) {
|
||||
int n;
|
||||
string text;
|
||||
string text, name, classname, targetbody;
|
||||
|
||||
// read attributes
|
||||
ReadAttrTxt(elem, "name", plight->name);
|
||||
ReadAttrTxt(elem, "class", plight->classname);
|
||||
ReadAttrTxt(elem, "target", plight->targetbody);
|
||||
if (ReadAttrTxt(elem, "name", name)) {
|
||||
mjm_setString(plight->name, name.c_str());
|
||||
}
|
||||
if (ReadAttrTxt(elem, "class", classname)) {
|
||||
mjm_setString(plight->classname, classname.c_str());
|
||||
}
|
||||
if (ReadAttrTxt(elem, "target", targetbody)) {
|
||||
mjm_setString(plight->targetbody, targetbody.c_str());
|
||||
}
|
||||
if (MapValue(elem, "mode", &n, camlight_map, camlight_sz)) {
|
||||
plight->mode = (mjtCamLight)n;
|
||||
}
|
||||
@@ -1691,7 +1717,9 @@ void mjXReader::OneLight(XMLElement* elem, mjCLight* plight) {
|
||||
ReadAttr(elem, "diffuse", 3, plight->diffuse, text);
|
||||
ReadAttr(elem, "specular", 3, plight->specular, text);
|
||||
|
||||
GetXMLPos(elem, plight);
|
||||
// write error info
|
||||
mjm_setString(plight->info,
|
||||
std::string("line = " + std::to_string(elem->GetLineNum()) + ", column = -1").c_str());
|
||||
}
|
||||
|
||||
|
||||
@@ -2226,29 +2254,29 @@ void mjXReader::OneComposite(XMLElement* elem, mjmBody* pbody, mjCDef* def) {
|
||||
|
||||
// particle joint
|
||||
if (MapValue(ejnt, "type", &n, joint_map, joint_sz)) {
|
||||
el->joint.type = (mjtJoint)n;
|
||||
el->joint.spec.type = (mjtJoint)n;
|
||||
}
|
||||
ReadAttr(ejnt, "axis", 3, el->joint.axis, text);
|
||||
ReadAttr(ejnt, "axis", 3, el->joint.spec.axis, text);
|
||||
|
||||
// solreffix, solimpfix
|
||||
ReadAttr(ejnt, "solreffix", mjNREF, el->equality.solref, text, false, false);
|
||||
ReadAttr(ejnt, "solimpfix", mjNIMP, el->equality.solimp, text, false, false);
|
||||
|
||||
// joint attributes
|
||||
MapValue(elem, "limited", &el->joint.limited, TFAuto_map, 3);
|
||||
ReadAttrInt(ejnt, "group", &el->joint.group);
|
||||
ReadAttr(ejnt, "solreflimit", mjNREF, el->joint.solref_limit, text, false, false);
|
||||
ReadAttr(ejnt, "solimplimit", mjNIMP, el->joint.solimp_limit, text, false, false);
|
||||
MapValue(elem, "limited", &el->joint.spec.limited, TFAuto_map, 3);
|
||||
ReadAttrInt(ejnt, "group", &el->joint.spec.group);
|
||||
ReadAttr(ejnt, "solreflimit", mjNREF, el->joint.spec.solref_limit, text, false, false);
|
||||
ReadAttr(ejnt, "solimplimit", mjNIMP, el->joint.spec.solimp_limit, text, false, false);
|
||||
ReadAttr(ejnt,
|
||||
"solreffriction", mjNREF, el->joint.solref_friction, text, false, false);
|
||||
"solreffriction", mjNREF, el->joint.spec.solref_friction, text, false, false);
|
||||
ReadAttr(ejnt,
|
||||
"solimpfriction", mjNIMP, el->joint.solimp_friction, text, false, false);
|
||||
ReadAttr(ejnt, "stiffness", 1, &el->joint.stiffness, text);
|
||||
ReadAttr(ejnt, "range", 2, el->joint.range, text);
|
||||
ReadAttr(ejnt, "margin", 1, &el->joint.margin, text);
|
||||
ReadAttr(ejnt, "armature", 1, &el->joint.armature, text);
|
||||
ReadAttr(ejnt, "damping", 1, &el->joint.damping, text);
|
||||
ReadAttr(ejnt, "frictionloss", 1, &el->joint.frictionloss, text);
|
||||
"solimpfriction", mjNIMP, el->joint.spec.solimp_friction, text, false, false);
|
||||
ReadAttr(ejnt, "stiffness", 1, &el->joint.spec.stiffness, text);
|
||||
ReadAttr(ejnt, "range", 2, el->joint.spec.range, text);
|
||||
ReadAttr(ejnt, "margin", 1, &el->joint.spec.margin, text);
|
||||
ReadAttr(ejnt, "armature", 1, &el->joint.spec.armature, text);
|
||||
ReadAttr(ejnt, "damping", 1, &el->joint.spec.damping, text);
|
||||
ReadAttr(ejnt, "frictionloss", 1, &el->joint.spec.frictionloss, text);
|
||||
|
||||
// advance
|
||||
ejnt = ejnt->NextSiblingElement("joint");
|
||||
@@ -2510,7 +2538,7 @@ void mjXReader::Default(XMLElement* section, int parentid) {
|
||||
else if (name=="material") OneMaterial(elem, &def->material);
|
||||
|
||||
// read joint
|
||||
else if (name=="joint") OneJoint(elem, &def->joint);
|
||||
else if (name=="joint") OneJoint(elem, &def->joint.spec);
|
||||
|
||||
// read geom
|
||||
else if (name=="geom") OneGeom(elem, &def->geom.spec);
|
||||
@@ -2519,10 +2547,10 @@ void mjXReader::Default(XMLElement* section, int parentid) {
|
||||
else if (name=="site") OneSite(elem, def->site.spec);
|
||||
|
||||
// read camera
|
||||
else if (name=="camera") OneCamera(elem, &def->camera);
|
||||
else if (name=="camera") OneCamera(elem, &def->camera.spec);
|
||||
|
||||
// read light
|
||||
else if (name=="light") OneLight(elem, &def->light);
|
||||
else if (name=="light") OneLight(elem, &def->light.spec);
|
||||
|
||||
// read pair
|
||||
else if (name=="pair") OnePair(elem, &def->pair);
|
||||
@@ -2546,6 +2574,13 @@ void mjXReader::Default(XMLElement* section, int parentid) {
|
||||
OneActuator(elem, &def->actuator);
|
||||
}
|
||||
|
||||
// copy into private attributes
|
||||
mjm_finalize(def->geom.spec.element);
|
||||
mjm_finalize(def->joint.spec.element);
|
||||
mjm_finalize(def->site.spec.element);
|
||||
mjm_finalize(def->camera.spec.element);
|
||||
mjm_finalize(def->light.spec.element);
|
||||
|
||||
// advance
|
||||
elem = elem->NextSiblingElement();
|
||||
}
|
||||
@@ -3059,9 +3094,9 @@ void mjXReader::Body(XMLElement* section, mjmBody* pbody, mjCFrame* frame) {
|
||||
}
|
||||
|
||||
// create joint and parse
|
||||
mjCJoint* pjoint = (mjCJoint*)mjm_addJoint(pbody, def);
|
||||
mjmJoint* pjoint = mjm_addJoint(pbody, def);
|
||||
OneJoint(elem, pjoint);
|
||||
pjoint->SetFrame(frame);
|
||||
mjm_setFrame(pjoint->element, frame);
|
||||
}
|
||||
|
||||
// freejoint sub-element
|
||||
@@ -3072,14 +3107,17 @@ void mjXReader::Body(XMLElement* section, mjmBody* pbody, mjCFrame* frame) {
|
||||
}
|
||||
|
||||
// create free joint without defaults
|
||||
mjCJoint* pjoint = (mjCJoint*)mjm_addFreeJoint(pbody);
|
||||
pjoint->SetFrame(frame);
|
||||
mjmJoint* pjoint = mjm_addFreeJoint(pbody);
|
||||
mjm_setFrame(pjoint->element, frame);
|
||||
|
||||
// save defaults after creation, to make sure writing is ok
|
||||
pjoint->def = def;
|
||||
mjm_setDefault(pjoint->element, def);
|
||||
|
||||
// read attributes
|
||||
ReadAttrTxt(elem, "name", pjoint->name);
|
||||
std::string name;
|
||||
if (ReadAttrTxt(elem, "name", name)) {
|
||||
mjm_setString(pjoint->name, name.c_str());
|
||||
}
|
||||
ReadAttrInt(elem, "group", &pjoint->group);
|
||||
}
|
||||
|
||||
@@ -3102,17 +3140,17 @@ void mjXReader::Body(XMLElement* section, mjmBody* pbody, mjCFrame* frame) {
|
||||
// camera sub-element
|
||||
else if (name=="camera") {
|
||||
// create camera and parse
|
||||
mjCCamera* pcam = (mjCCamera*)mjm_addCamera(pbody, def);
|
||||
mjmCamera* pcam = mjm_addCamera(pbody, def);
|
||||
OneCamera(elem, pcam);
|
||||
pcam->SetFrame(frame);
|
||||
mjm_setFrame(pcam->element, frame);
|
||||
}
|
||||
|
||||
// light sub-element
|
||||
else if (name=="light") {
|
||||
// create light and parse
|
||||
mjCLight* plight = (mjCLight*)mjm_addLight(pbody, def);
|
||||
mjmLight* plight = mjm_addLight(pbody, def);
|
||||
OneLight(elem, plight);
|
||||
plight->SetFrame(frame);
|
||||
mjm_setFrame(plight->element, frame);
|
||||
}
|
||||
|
||||
// plugin sub-element
|
||||
@@ -3162,10 +3200,12 @@ void mjXReader::Body(XMLElement* section, mjmBody* pbody, mjCFrame* frame) {
|
||||
|
||||
// read attributes
|
||||
std::string name, childclass;
|
||||
ReadAttrTxt(elem, "name", name);
|
||||
mjm_setString(pchild->name, name.c_str());
|
||||
ReadAttrTxt(elem, "childclass", childclass);
|
||||
mjm_setString(pchild->classname, childclass.c_str());
|
||||
if (ReadAttrTxt(elem, "name", name)) {
|
||||
mjm_setString(pchild->name, name.c_str());
|
||||
}
|
||||
if (ReadAttrTxt(elem, "childclass", childclass)) {
|
||||
mjm_setString(pchild->classname, childclass.c_str());
|
||||
}
|
||||
ReadAttr(elem, "pos", 3, pchild->pos, text);
|
||||
ReadQuat(elem, "quat", pchild->quat, text);
|
||||
if (MapValue(elem, "mocap", &n, bool_map, 2)) {
|
||||
|
||||
@@ -57,11 +57,11 @@ class mjXReader : public mjXBase {
|
||||
void OneMesh(tinyxml2::XMLElement* elem, mjCMesh* pmesh);
|
||||
void OneSkin(tinyxml2::XMLElement* elem, mjCSkin* pskin);
|
||||
void OneMaterial(tinyxml2::XMLElement* elem, mjCMaterial* pmaterial);
|
||||
void OneJoint(tinyxml2::XMLElement* elem, mjCJoint* pjoint);
|
||||
void OneJoint(tinyxml2::XMLElement* elem, mjmJoint* pjoint);
|
||||
void OneGeom(tinyxml2::XMLElement* elem, mjmGeom* pgeom);
|
||||
void OneSite(tinyxml2::XMLElement* elem, mjmSite& site);
|
||||
void OneCamera(tinyxml2::XMLElement* elem, mjCCamera* pcamera);
|
||||
void OneLight(tinyxml2::XMLElement* elem, mjCLight* plight);
|
||||
void OneCamera(tinyxml2::XMLElement* elem, mjmCamera* pcamera);
|
||||
void OneLight(tinyxml2::XMLElement* elem, mjmLight* plight);
|
||||
void OnePair(tinyxml2::XMLElement* elem, mjCPair* ppair);
|
||||
void OneEquality(tinyxml2::XMLElement* elem, mjCEquality* pequality);
|
||||
void OneTendon(tinyxml2::XMLElement* elem, mjCTendon* ptendon);
|
||||
|
||||
@@ -322,9 +322,9 @@ void mjXWriter::OneJoint(XMLElement* elem, mjCJoint* pjoint, mjCDef* def) {
|
||||
|
||||
// userdata
|
||||
if (writingdefaults) {
|
||||
WriteVector(elem, "user", pjoint->userdata);
|
||||
WriteVector(elem, "user", pjoint->get_userdata());
|
||||
} else {
|
||||
WriteVector(elem, "user", pjoint->userdata, def->joint.userdata);
|
||||
WriteVector(elem, "user", pjoint->get_userdata(), def->joint.get_userdata());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -468,7 +468,7 @@ void mjXWriter::OneCamera(XMLElement* elem, mjCCamera* pcam, mjCDef* def) {
|
||||
if (!writingdefaults) {
|
||||
WriteAttrTxt(elem, "name", pcam->name);
|
||||
WriteAttrTxt(elem, "class", pcam->classname);
|
||||
WriteAttrTxt(elem, "target", pcam->targetbody);
|
||||
WriteAttrTxt(elem, "target", pcam->get_targetbody());
|
||||
WriteAttr(elem, "pos", 3, pcam->pos);
|
||||
WriteAttr(elem, "quat", 4, pcam->quat, unitq);
|
||||
}
|
||||
@@ -494,9 +494,9 @@ void mjXWriter::OneCamera(XMLElement* elem, mjCCamera* pcam, mjCDef* def) {
|
||||
|
||||
// userdata
|
||||
if (writingdefaults) {
|
||||
WriteVector(elem, "user", pcam->userdata);
|
||||
WriteVector(elem, "user", pcam->get_userdata());
|
||||
} else {
|
||||
WriteVector(elem, "user", pcam->userdata, def->camera.userdata);
|
||||
WriteVector(elem, "user", pcam->get_userdata(), def->camera.get_userdata());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,7 +508,7 @@ void mjXWriter::OneLight(XMLElement* elem, mjCLight* plight, mjCDef* def) {
|
||||
if (!writingdefaults) {
|
||||
WriteAttrTxt(elem, "name", plight->name);
|
||||
WriteAttrTxt(elem, "class", plight->classname);
|
||||
WriteAttrTxt(elem, "target", plight->targetbody);
|
||||
WriteAttrTxt(elem, "target", plight->get_targetbody());
|
||||
WriteAttr(elem, "pos", 3, plight->pos);
|
||||
WriteAttr(elem, "dir", 3, plight->dir);
|
||||
}
|
||||
|
||||
+15
-15
@@ -210,8 +210,8 @@ void mjXURDF::Parse(
|
||||
// add a free joint to allow motion of the body
|
||||
// if the mass is 0, assume the object is static
|
||||
if (!static_body && pbody->mass > 0) {
|
||||
mjCJoint* pjoint = (mjCJoint*)mjm_addJoint(pbody, 0);
|
||||
pjoint->name = urName[i] + "_free_joint";
|
||||
mjmJoint* pjoint = mjm_addJoint(pbody, 0);
|
||||
mjm_setString(pjoint->name, (urName[i] + "_free_joint").c_str());
|
||||
pjoint->type = mjJNT_FREE;
|
||||
}
|
||||
}
|
||||
@@ -371,7 +371,7 @@ void mjXURDF::Joint(XMLElement* joint_elem) {
|
||||
std::string jntname, name, text;
|
||||
XMLElement *elem;
|
||||
mjmBody *pbody, *parent, *world;
|
||||
mjCJoint *pjoint=0, *pjoint1=0, *pjoint2=0;
|
||||
mjmJoint *pjoint=0, *pjoint1=0, *pjoint2=0;
|
||||
int jointtype;
|
||||
|
||||
// get type and name
|
||||
@@ -414,16 +414,16 @@ void mjXURDF::Joint(XMLElement* joint_elem) {
|
||||
switch (jointtype) {
|
||||
case 0: // revolute
|
||||
case 1: // continuous
|
||||
pjoint = (mjCJoint*)mjm_addJoint(pbody, 0);
|
||||
pjoint->name = jntname;
|
||||
pjoint = mjm_addJoint(pbody, 0);
|
||||
mjm_setString(pjoint->name, jntname.c_str());
|
||||
pjoint->type = mjJNT_HINGE;
|
||||
mjuu_setvec(pjoint->pos, 0, 0, 0);
|
||||
mjuu_copyvec(pjoint->axis, axis, 3);
|
||||
break;
|
||||
|
||||
case 2: // prismatic
|
||||
pjoint = (mjCJoint*)mjm_addJoint(pbody, 0);
|
||||
pjoint->name = jntname;
|
||||
pjoint = mjm_addJoint(pbody, 0);
|
||||
mjm_setString(pjoint->name, jntname.c_str());
|
||||
pjoint->type = mjJNT_SLIDE;
|
||||
mjuu_setvec(pjoint->pos, 0, 0, 0);
|
||||
mjuu_copyvec(pjoint->axis, axis, 3);
|
||||
@@ -433,8 +433,8 @@ void mjXURDF::Joint(XMLElement* joint_elem) {
|
||||
return;
|
||||
|
||||
case 4: // floating
|
||||
pjoint = (mjCJoint*)mjm_addJoint(pbody, 0);
|
||||
pjoint->name = jntname;
|
||||
pjoint = mjm_addJoint(pbody, 0);
|
||||
mjm_setString(pjoint->name, jntname.c_str());
|
||||
pjoint->type = mjJNT_FREE;
|
||||
break;
|
||||
|
||||
@@ -444,8 +444,8 @@ void mjXURDF::Joint(XMLElement* joint_elem) {
|
||||
mjuu_quat2mat(mat, quat);
|
||||
|
||||
// construct slider along x
|
||||
pjoint = (mjCJoint*)mjm_addJoint(pbody, 0);
|
||||
pjoint->name = jntname + "_TX";
|
||||
pjoint = mjm_addJoint(pbody, 0);
|
||||
mjm_setString(pjoint->name, (jntname + "_TX").c_str());
|
||||
pjoint->type = mjJNT_SLIDE;
|
||||
tmpaxis[0] = mat[0];
|
||||
tmpaxis[1] = mat[3];
|
||||
@@ -454,8 +454,8 @@ void mjXURDF::Joint(XMLElement* joint_elem) {
|
||||
mjuu_copyvec(pjoint->axis, tmpaxis, 3);
|
||||
|
||||
// construct slider along y
|
||||
pjoint1 = (mjCJoint*)mjm_addJoint(pbody, 0);
|
||||
pjoint1->name = jntname + "_TY";
|
||||
pjoint1 = mjm_addJoint(pbody, 0);
|
||||
mjm_setString(pjoint1->name, (jntname + "_TY").c_str());
|
||||
pjoint1->type = mjJNT_SLIDE;
|
||||
tmpaxis[0] = mat[1];
|
||||
tmpaxis[1] = mat[4];
|
||||
@@ -464,8 +464,8 @@ void mjXURDF::Joint(XMLElement* joint_elem) {
|
||||
mjuu_copyvec(pjoint1->axis, tmpaxis, 3);
|
||||
|
||||
// construct hinge around z = locaxis
|
||||
pjoint2 = (mjCJoint*)mjm_addJoint(pbody, 0);
|
||||
pjoint2->name = jntname + "_RZ";
|
||||
pjoint2 = mjm_addJoint(pbody, 0);
|
||||
mjm_setString(pjoint2->name, (jntname + "_RZ").c_str());
|
||||
pjoint2->type = mjJNT_HINGE;
|
||||
mjuu_setvec(pjoint2->pos, 0, 0, 0);
|
||||
mjuu_copyvec(pjoint2->axis, axis, 3);
|
||||
|
||||
Reference in New Issue
Block a user