From b77dfc683a7056a94830b6921786c59a3c4e92a4 Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Mon, 19 Feb 2024 02:01:13 -0800 Subject: [PATCH] Use OnePlugin for parsing Composite and Flexcomp plugins. PiperOrigin-RevId: 608265172 Change-Id: I053441a9e534d81c4847ad60fe4a3f7dce87350c --- src/user/user_api.cc | 5 ++-- src/user/user_api.h | 5 +++- src/user/user_composite.cc | 44 +++++++++++++++++++++--------------- src/user/user_composite.h | 3 +-- src/user/user_flexcomp.cc | 31 ++++++++++++++----------- src/user/user_flexcomp.h | 4 ++-- src/user/user_init.cc | 6 +++++ src/user/user_objects.cc | 10 ++++++-- src/xml/xml_native_reader.cc | 26 +++++++-------------- 9 files changed, 76 insertions(+), 58 deletions(-) diff --git a/src/user/user_api.cc b/src/user/user_api.cc index 4473ee35..e666f63d 100644 --- a/src/user/user_api.cc +++ b/src/user/user_api.cc @@ -315,10 +315,11 @@ mjmKey* mjm_addKey(mjmModel* model) { // add plugin to model -mjElement mjm_addPlugin(mjmModel* model) { +mjmPlugin* mjm_addPlugin(mjmModel* model) { mjCModel* modelC = reinterpret_cast(model->element); mjCPlugin* plugin = modelC->AddPlugin(); - return (mjElement)plugin; + plugin->plugin.instance = (mjElement)plugin; + return &plugin->plugin; } diff --git a/src/user/user_api.h b/src/user/user_api.h index 410242e5..9d9eee68 100644 --- a/src/user/user_api.h +++ b/src/user/user_api.h @@ -761,7 +761,7 @@ MJAPI mjmTuple* mjm_addTuple(mjmModel* model); MJAPI mjmKey* mjm_addKey(mjmModel* model); // Add plugin to model. -MJAPI mjElement mjm_addPlugin(mjmModel* model); +MJAPI mjmPlugin* mjm_addPlugin(mjmModel* model); // Add default to model. MJAPI mjmDefault* mjm_addDefault(mjmModel* model, const char* classname, int parentid); @@ -895,6 +895,9 @@ MJAPI void mjm_defaultTuple(mjmTuple& tuple); // Default keyframe attributes. MJAPI void mjm_defaultKey(mjmKey& key); +// Default plugin attributes. +MJAPI void mjm_defaultPlugin(mjmPlugin& plugin); + #ifdef __cplusplus } #endif diff --git a/src/user/user_composite.cc b/src/user/user_composite.cc index 415fde0a..058d7b39 100644 --- a/src/user/user_composite.cc +++ b/src/user/user_composite.cc @@ -64,7 +64,13 @@ mjCComposite::mjCComposite(void) { pin.clear(); flatinertia = 0; mj_defaultSolRefImp(solrefsmooth, solimpsmooth); - plugin_instance = nullptr; + + // plugin variables + mjm_defaultPlugin(plugin); + plugin_name = ""; + plugin_instance_name = ""; + plugin.name = (mjString)&plugin_name; + plugin.instance_name = (mjString)&plugin_instance_name; // cable curve[0] = curve[1] = curve[2] = mjCOMPSHAPE_ZERO; @@ -423,9 +429,10 @@ bool mjCComposite::MakeParticle(mjCModel* model, mjmBody* body, char* error, int // compute volume std::vector volume(uservert.size()/3); mjtNum t = 1; - if (dim == 2 && plugin_instance) { + if (dim == 2 && plugin.active) { try { - t = std::stod(plugin_instance->config_attribs["thickness"], nullptr); + mjCPlugin* pplugin = (mjCPlugin*)plugin.instance; + t = std::stod(pplugin->config_attribs["thickness"], nullptr); } catch (const std::invalid_argument& e) { return comperr(error, "Invalid thickness attribute", error_sz); } @@ -502,19 +509,20 @@ bool mjCComposite::MakeParticle(mjCModel* model, mjmBody* body, char* error, int mjm_setString(s->name, txt); // add plugin - if (plugin_instance) { - mjmPlugin* plugin = &b->plugin; - plugin->active = true; - plugin->instance = (mjElement)plugin_instance; - mjm_setString(plugin->instance_name, plugin_instance_name.c_str()); - mjm_setString(plugin->name, plugin_name.c_str()); + if (plugin.active) { + mjmPlugin* pplugin = &b->plugin; + mjCPlugin* cplugin = (mjCPlugin*)plugin.instance; + pplugin->active = true; + pplugin->instance = (mjElement)plugin.instance; + mjm_setString(pplugin->instance_name, plugin_instance_name.c_str()); + mjm_setString(pplugin->name, mjm_getString(plugin.name)); - if (i==0 && !plugin_instance->config_attribs["face"].empty()) { + if (i==0 && !cplugin->config_attribs["face"].empty()) { return comperr(error, "Face attribute already exists in plugin", error_sz); } - plugin_instance->config_attribs["face"] = userface; - plugin_instance->config_attribs["edge"] = ""; + cplugin->config_attribs["face"] = userface; + cplugin->config_attribs["edge"] = ""; // update density if (dim == 2) { @@ -856,12 +864,12 @@ mjmBody* mjCComposite::AddCableBody(mjCModel* model, mjmBody* body, int ix, mjtN } // add plugin - if (plugin_instance) { - mjmPlugin* plugin = &body->plugin; - plugin->active = true; - plugin->instance = (mjElement)plugin_instance; - mjm_setString(plugin->name, plugin_name.c_str()); - mjm_setString(plugin->instance_name, plugin_instance_name.c_str()); + if (plugin.active) { + mjmPlugin* pplugin = &body->plugin; + pplugin->active = true; + pplugin->instance = (mjElement)plugin.instance; + mjm_setString(pplugin->name, mjm_getString(plugin.name)); + mjm_setString(pplugin->instance_name, plugin_instance_name.c_str()); } // update orientation diff --git a/src/user/user_composite.h b/src/user/user_composite.h index 161b24ee..34f88fa1 100644 --- a/src/user/user_composite.h +++ b/src/user/user_composite.h @@ -114,10 +114,9 @@ class mjCComposite { std::vector username; // plugin support - bool is_plugin; std::string plugin_name; std::string plugin_instance_name; - mjCPlugin* plugin_instance; + mjmPlugin plugin; // skin bool skin; // generate skin diff --git a/src/user/user_flexcomp.cc b/src/user/user_flexcomp.cc index 9e149d08..0a754073 100644 --- a/src/user/user_flexcomp.cc +++ b/src/user/user_flexcomp.cc @@ -71,7 +71,12 @@ mjCFlexcomp::mjCFlexcomp(void) { mjuu_setvec(quat, 1, 0, 0, 0); rigid = false; centered = false; - plugin_instance = nullptr; + + mjm_defaultPlugin(plugin); + plugin_name = ""; + plugin_instance_name = ""; + plugin.name = (mjString)&plugin_name; + plugin.instance_name = (mjString)&plugin_instance_name; } @@ -404,12 +409,12 @@ bool mjCFlexcomp::Make(mjCModel* model, mjmBody* body, char* error, int error_sz mjm_appendString(pf->vertbody, mjm_getString(body->name)); // add plugin - if (plugin_instance) { - mjmPlugin* plugin = &body->plugin; - plugin->active = true; - plugin->instance = (mjElement)plugin_instance; - mjm_setString(plugin->name, plugin_name.c_str()); - mjm_setString(plugin->instance_name, plugin_instance_name.c_str()); + if (plugin.active) { + mjmPlugin* pplugin = &body->plugin; + pplugin->active = true; + pplugin->instance = (mjElement)plugin.instance; + mjm_setString(pplugin->name, mjm_getString(plugin.name)); + mjm_setString(pplugin->instance_name, plugin_instance_name.c_str()); } } @@ -468,12 +473,12 @@ bool mjCFlexcomp::Make(mjCModel* model, mjmBody* body, char* error, int error_sz } // add plugin - if (plugin_instance) { - mjmPlugin* plugin = &pb->plugin; - plugin->active = true; - plugin->instance = (mjElement)plugin_instance; - mjm_setString(plugin->name, plugin_name.c_str()); - mjm_setString(plugin->instance_name, plugin_instance_name.c_str()); + if (plugin.active) { + mjmPlugin* pplugin = &pb->plugin; + pplugin->active = true; + pplugin->instance = (mjElement)plugin.instance; + mjm_setString(pplugin->name, mjm_getString(plugin.name)); + mjm_setString(pplugin->instance_name, plugin_instance_name.c_str()); } } } diff --git a/src/user/user_flexcomp.h b/src/user/user_flexcomp.h index 524f2365..d966af68 100644 --- a/src/user/user_flexcomp.h +++ b/src/user/user_flexcomp.h @@ -19,6 +19,7 @@ #include #include +#include "user/user_api.h" #include "user/user_model.h" #include "user/user_objects.h" @@ -87,10 +88,9 @@ class mjCFlexcomp { std::vector texcoord; // vertex texture coordinates // plugin support - bool is_plugin; std::string plugin_name; std::string plugin_instance_name; - mjCPlugin* plugin_instance; + mjmPlugin plugin; }; #endif // MUJOCO_SRC_USER_USER_FLEXCOMP_H_ diff --git a/src/user/user_init.cc b/src/user/user_init.cc index d58c84cb..f986e7e4 100644 --- a/src/user/user_init.cc +++ b/src/user/user_init.cc @@ -366,3 +366,9 @@ void mjm_defaultKey(mjmKey& key) { } + +// default plugin attributes +void mjm_defaultPlugin(mjmPlugin& plugin) { + memset(&plugin, 0, sizeof(mjmPlugin)); +} + diff --git a/src/user/user_objects.cc b/src/user/user_objects.cc index 50ad9770..0a36b708 100644 --- a/src/user/user_objects.cc +++ b/src/user/user_objects.cc @@ -546,8 +546,7 @@ mjCBase::mjCBase() { frame = nullptr; // plugin variables - plugin.active = false; - plugin.instance = nullptr; + mjm_defaultPlugin(plugin); plugin_name = ""; plugin_instance_name = ""; plugin.name = (mjString)&plugin_name; @@ -5337,6 +5336,13 @@ mjCPlugin::mjCPlugin(mjCModel* _model) { nstate = 0; parent = this; model = _model; + + // public interface + mjm_defaultPlugin(plugin); + plugin_name = ""; + plugin_instance_name = ""; + plugin.name = (mjString)&plugin_name; + plugin.instance_name = (mjString)&plugin_instance_name; } diff --git a/src/xml/xml_native_reader.cc b/src/xml/xml_native_reader.cc index 61e96b7c..35b990ef 100644 --- a/src/xml/xml_native_reader.cc +++ b/src/xml/xml_native_reader.cc @@ -2273,16 +2273,11 @@ void mjXReader::OneComposite(XMLElement* elem, mjmBody* pbody, mjmDefault* def) // plugin XMLElement* eplugin = FirstChildElement(elem, "plugin"); if (eplugin) { - ReadAttrTxt(eplugin, "plugin", comp.plugin_name); - ReadAttrTxt(eplugin, "instance", comp.plugin_instance_name); + OnePlugin(eplugin, &comp.plugin); if (comp.plugin_instance_name.empty()) { - comp.plugin_instance = (mjCPlugin*)mjm_addPlugin(&model->spec); - comp.plugin_instance->name = "composite"+comp.prefix; - comp.plugin_instance_name = comp.plugin_instance->name; - } else { - model->hasImplicitPluginElem = true; + comp.plugin_instance_name = "composite" + comp.prefix; + ((mjCPlugin*)comp.plugin.instance)->name = comp.plugin_instance_name; } - ReadPluginConfigs(eplugin, comp.plugin_instance); } // cable @@ -2604,16 +2599,11 @@ void mjXReader::OneFlexcomp(XMLElement* elem, mjmBody* pbody) { // plugin XMLElement* eplugin = FirstChildElement(elem, "plugin"); if (eplugin) { - ReadAttrTxt(eplugin, "plugin", fcomp.plugin_name); - ReadAttrTxt(eplugin, "instance", fcomp.plugin_instance_name); + OnePlugin(eplugin, &fcomp.plugin); if (fcomp.plugin_instance_name.empty()) { - fcomp.plugin_instance = (mjCPlugin*)mjm_addPlugin(&model->spec); - fcomp.plugin_instance->name = "flexcomp_" + fcomp.name; - fcomp.plugin_instance_name = fcomp.plugin_instance->name; - } else { - model->hasImplicitPluginElem = true; + fcomp.plugin_instance_name = "flexcomp_" + fcomp.name; + ((mjCPlugin*)fcomp.plugin.instance)->name = fcomp.plugin_instance_name; } - ReadPluginConfigs(eplugin, fcomp.plugin_instance); } // make flexcomp @@ -2638,7 +2628,7 @@ void mjXReader::OnePlugin(XMLElement* elem, mjmPlugin* plugin) { mjm_setString(plugin->name, name.c_str()); mjm_setString(plugin->instance_name, instance_name.c_str()); if (instance_name.empty()) { - plugin->instance = mjm_addPlugin(&model->spec); + plugin->instance = mjm_addPlugin(&model->spec)->instance; ReadPluginConfigs(elem, (mjCPlugin*)plugin->instance); } else { model->hasImplicitPluginElem = true; @@ -2797,7 +2787,7 @@ void mjXReader::Extension(XMLElement* section) { throw mjXError( child, "explicit plugin instance must appear before implicit plugin elements"); } - mjCPlugin* pp = (mjCPlugin*)mjm_addPlugin(&model->spec); + mjCPlugin* pp = (mjCPlugin*)mjm_addPlugin(&model->spec)->instance; GetXMLPos(child, pp); ReadAttrTxt(child, "name", pp->name, /* required = */ true); if (pp->name.empty()) {