Add compiler C API for mjmSite.

PiperOrigin-RevId: 604573450
Change-Id: I6ba7fcece0942ddc0d109413ba5684b2df3fab96
This commit is contained in:
Alessio Quaglino
2024-02-06 01:50:01 -08:00
committed by Copybara-Service
parent f763254a00
commit 3b2dd06c54
13 changed files with 342 additions and 73 deletions
+2 -1
View File
@@ -21,6 +21,7 @@
#include <string>
#include <vector>
#include "user/user_api.h"
#include "user/user_model.h"
#include "user/user_objects.h"
#include "tinyxml2.h"
@@ -50,7 +51,7 @@ void mjXBase::SetModel(mjCModel* _model) {
// read alternative orientation specification
void mjXBase::ReadAlternative(XMLElement* elem, mjCAlternative& alt) {
void mjXBase::ReadAlternative(XMLElement* elem, mjmOrientation& alt) {
string text;
int read = (int)(elem->Attribute("quat") != 0) +
(ReadAttr(elem, "axisangle", 4, alt.axisangle, text) ? 1 : 0) +
+1 -1
View File
@@ -92,7 +92,7 @@ class mjXBase : public mjXUtil {
void SetModel(mjCModel*);
// read alternative orientation specification
static void ReadAlternative(tinyxml2::XMLElement* elem, mjCAlternative& alt);
static void ReadAlternative(tinyxml2::XMLElement* elem, mjmOrientation& alt);
protected:
mjCModel* model; // internally-allocated mjCModel object
+28 -22
View File
@@ -33,6 +33,7 @@
#include "engine/engine_plugin.h"
#include "engine/engine_util_errmem.h"
#include "engine/engine_util_misc.h"
#include "user/user_api.h"
#include "user/user_composite.h"
#include "user/user_flexcomp.h"
#include "user/user_model.h"
@@ -1563,34 +1564,39 @@ void mjXReader::OneGeom(XMLElement* elem, mjCGeom* pgeom) {
// site element parser
void mjXReader::OneSite(XMLElement* elem, mjCSite* site) {
void mjXReader::OneSite(XMLElement* elem, mjmSite& site) {
int n;
string text;
mjmSite* psite = &site->spec;
string text, name, classname;
std::vector<double> userdata;
std::string material;
// read attributes
ReadAttrTxt(elem, "name", site->name);
ReadAttrTxt(elem, "class", site->classname);
ReadAttrTxt(elem, "name", name);
ReadAttrTxt(elem, "class", classname);
if (MapValue(elem, "type", &n, geom_map, mjNGEOMTYPES)) {
psite->type = (mjtGeom)n;
site.type = (mjtGeom)n;
}
ReadAttr(elem, "size", 3, psite->size, text, false, false);
ReadAttrInt(elem, "group", &psite->group);
ReadAttr(elem, "pos", 3, psite->pos, text);
ReadQuat(elem, "quat", psite->quat, text);
ReadAttr(elem, "size", 3, site.size, text, false, false);
ReadAttrInt(elem, "group", &site.group);
ReadAttr(elem, "pos", 3, site.pos, text);
ReadQuat(elem, "quat", site.quat, text);
ReadAttrTxt(elem, "material", material);
ReadAttr(elem, "rgba", 4, psite->rgba, text);
ReadAttr(elem, "fromto", 6, psite->fromto, text);
ReadAlternative(elem, psite->alt);
ReadAttr(elem, "rgba", 4, site.rgba, text);
ReadAttr(elem, "fromto", 6, site.fromto, text);
ReadAlternative(elem, site.alt);
ReadVector(elem, "user", userdata, text);
// set variable-size attributes
site->set_userdata(userdata);
site->set_material(material);
// set strings
mjm_setString(site.name, name.c_str());
mjm_setString(site.classname, classname.c_str());
mjm_setString(site.material, material.c_str());
GetXMLPos(elem, site);
// set pointers
mjm_setDouble(site.userdata, userdata.data(), userdata.size());
// set info
mjm_setString(site.info,
std::string("line = " + std::to_string(elem->GetLineNum()) + ", column = -1").c_str());
}
@@ -2177,7 +2183,7 @@ void mjXReader::OneComposite(XMLElement* elem, mjCBody* pbody, mjCDef* def) {
ReadAttrInt(esite, "group", &dsite.group);
ReadAttrTxt(esite, "material", material);
ReadAttr(esite, "rgba", 4, dsite.rgba, text);
comp.def[0].site.set_material(material);
mjm_setString(dsite.material, material.c_str());
}
// joint
@@ -2487,7 +2493,7 @@ void mjXReader::Default(XMLElement* section, int parentid) {
else if (name=="geom") OneGeom(elem, &def->geom);
// read site
else if (name=="site") OneSite(elem, &def->site);
else if (name=="site") OneSite(elem, def->site.spec);
// read camera
else if (name=="camera") OneCamera(elem, &def->camera);
@@ -3061,9 +3067,9 @@ void mjXReader::Body(XMLElement* section, mjCBody* pbody, mjCFrame* frame) {
// site sub-element
else if (name=="site") {
// create site and parse
mjCSite* psite = pbody->AddSite(def);
OneSite(elem, psite);
psite->SetFrame(frame);
mjmSite* site = mjm_addSite(pbody, def);
OneSite(elem, *site);
mjm_setFrame(site, frame);
}
// camera sub-element
+1 -1
View File
@@ -59,7 +59,7 @@ class mjXReader : public mjXBase {
void OneMaterial(tinyxml2::XMLElement* elem, mjCMaterial* pmaterial);
void OneJoint(tinyxml2::XMLElement* elem, mjCJoint* pjoint);
void OneGeom(tinyxml2::XMLElement* elem, mjCGeom* pgeom);
void OneSite(tinyxml2::XMLElement* elem, mjCSite* psite);
void OneSite(tinyxml2::XMLElement* elem, mjmSite& site);
void OneCamera(tinyxml2::XMLElement* elem, mjCCamera* pcamera);
void OneLight(tinyxml2::XMLElement* elem, mjCLight* plight);
void OnePair(tinyxml2::XMLElement* elem, mjCPair* ppair);
+3 -3
View File
@@ -1034,7 +1034,7 @@ template void mjXUtil::WriteAttr(XMLElement* elem, string name, int n,
// write vector<double> attribute, default = zero array
void mjXUtil::WriteVector(XMLElement* elem, string name, vector<double>& vec) {
void mjXUtil::WriteVector(XMLElement* elem, string name, const vector<double>& vec) {
// proceed only if non-zero found
bool ok = false;
for (size_t i=0; i<vec.size(); i++) {
@@ -1053,8 +1053,8 @@ void mjXUtil::WriteVector(XMLElement* elem, string name, vector<double>& vec) {
// write vector<double> attribute, default with same size
void mjXUtil::WriteVector(XMLElement* elem, string name, vector<double>& vec,
vector<double>& def) {
void mjXUtil::WriteVector(XMLElement* elem, string name, const vector<double>& vec,
const vector<double>& def) {
// proceed only if non-zero found
bool ok = false;
for (size_t i=0; i<vec.size(); i++) {
+4 -3
View File
@@ -198,9 +198,10 @@ class mjXUtil {
const T* def = 0);
// write vector<double> attribute, with and without default
static void WriteVector(tinyxml2::XMLElement* elem, std::string name, std::vector<double>& vec);
static void WriteVector(tinyxml2::XMLElement* elem, std::string name, std::vector<double>& vec,
std::vector<double>& def);
static void WriteVector(tinyxml2::XMLElement* elem, std::string name,
const std::vector<double>& vec);
static void WriteVector(tinyxml2::XMLElement* elem, std::string name,
const std::vector<double>& vec, const std::vector<double>& def);
// write attribute- string
static void WriteAttrTxt(tinyxml2::XMLElement* elem, std::string name, std::string value);