Remove mjCPlugin from xml_native_reader.

PiperOrigin-RevId: 608546883
Change-Id: Ib529c2756102e4e2185d1d8e9585187c30049011
This commit is contained in:
Alessio Quaglino
2024-02-20 03:45:42 -08:00
committed by Copybara-Service
parent b56d4bf8a5
commit 78dc5aee9f
13 changed files with 93 additions and 80 deletions
+15 -2
View File
@@ -13,7 +13,10 @@
// limitations under the License.
#include "user/user_api.h"
#include <functional>
#include <map>
#include <string>
#include <utility>
#include <vector>
#include <mujoco/mujoco.h>
@@ -318,8 +321,8 @@ mjmKey* mjm_addKey(mjmModel* model) {
mjmPlugin* mjm_addPlugin(mjmModel* model) {
mjCModel* modelC = reinterpret_cast<mjCModel*>(model->element);
mjCPlugin* plugin = modelC->AddPlugin();
plugin->plugin.instance = (mjElement)plugin;
return &plugin->plugin;
plugin->spec.instance = (mjElement)plugin;
return &plugin->spec;
}
@@ -508,6 +511,16 @@ const double* mjm_getDouble(const mjDoubleVec source, int* size) {
// set plugin attributes
void mjm_setPluginAttributes(mjmPlugin* plugin, void* attributes) {
mjCPlugin* pluginC = reinterpret_cast<mjCPlugin*>(plugin->instance);
std::map<std::string, std::string, std::less<>>* config_attribs =
reinterpret_cast<std::map<std::string, std::string, std::less<>>*>(attributes);
pluginC->config_attribs = std::move(*config_attribs);
}
// compute full inertia
const char* mjm_setFullInertia(mjmBody* bodyspec, double quat[4], double inertia[3]) {
mjCBody* body = reinterpret_cast<mjCBody*>(bodyspec->element);
+6 -1
View File
@@ -88,7 +88,9 @@ typedef struct _mjmPlugin { // plugin specification
mjElement instance; // internal, do not modify
mjString name; // name
mjString instance_name; // instance name
bool active; // is the plugin active
int plugin_slot; // global registered slot number of the plugin
mjtByte active; // is the plugin active
mjString info; // message appended to compiler errors
} mjmPlugin;
@@ -814,6 +816,9 @@ MJAPI const char* mjm_getString(mjString source);
// Get double array contents and optionally its size.
MJAPI const double* mjm_getDouble(mjDoubleVec source, int* size);
// Set plugin attributes.
MJAPI void mjm_setPluginAttributes(mjmPlugin* plugin, void* attributes);
// Set default.
MJAPI void mjm_setDefault(mjElement element, mjmDefault* def);
+6
View File
@@ -308,6 +308,12 @@ bool mjCComposite::Make(mjCModel* model, mjmBody* body, char* error, int error_s
}
}
// overwrite plugin name
if (plugin_instance_name.empty() && plugin.active) {
plugin_instance_name = "composite" + prefix;
((mjCPlugin*)plugin.instance)->name = plugin_instance_name;
}
// dispatch
switch (type) {
case mjCOMPTYPE_PARTICLE:
+6
View File
@@ -397,6 +397,12 @@ bool mjCFlexcomp::Make(mjCModel* model, mjmBody* body, char* error, int error_sz
double bodymass = mass/npnt;
double bodyinertia = bodymass*(2.0*inertiabox*inertiabox)/3.0;
// overwrite plugin name
if (plugin.active && plugin_instance_name.empty()) {
plugin_instance_name = "flexcomp_" + name;
((mjCPlugin*)plugin.instance)->name = plugin_instance_name;
}
// create bodies, construct flex vert and vertbody
for (int i=0; i<npnt; i++) {
// not used: skip
+1
View File
@@ -370,5 +370,6 @@ void mjm_defaultKey(mjmKey& key) {
// default plugin attributes
void mjm_defaultPlugin(mjmPlugin& plugin) {
memset(&plugin, 0, sizeof(mjmPlugin));
plugin.plugin_slot = -1;
}
+1 -1
View File
@@ -257,7 +257,7 @@ void mjCMesh::LoadSDF() {
mjCPlugin* plugin_instance = (mjCPlugin*)plugin.instance;
model->ResolvePlugin(this, plugin_name, plugin_instance_name, &plugin_instance);
const mjpPlugin* pplugin = mjp_getPluginAtSlot(plugin_instance->plugin_slot);
const mjpPlugin* pplugin = mjp_getPluginAtSlot(plugin_instance->spec.plugin_slot);
if (!(pplugin->capabilityflags & mjPLUGIN_SDF)) {
throw mjCError(this, "plugin '%s' does not support signed distance fields", pplugin->name);
}
+5 -5
View File
@@ -3044,7 +3044,7 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) {
{
int adr = 0;
for (int i = 0; i < nplugin; ++i) {
m->plugin[i] = plugins[i]->plugin_slot;
m->plugin[i] = plugins[i]->spec.plugin_slot;
const int size = plugins[i]->flattened_attributes.size();
std::memcpy(m->plugin_attr + adr,
plugins[i]->flattened_attributes.data(), size);
@@ -3575,8 +3575,8 @@ void mjCModel::ResolvePlugin(mjCBase* obj, const std::string& plugin_name,
}
// implicit plugin instance
if (*plugin_instance && (*plugin_instance)->plugin_slot == -1) {
(*plugin_instance)->plugin_slot = plugin_slot;
if (*plugin_instance && (*plugin_instance)->spec.plugin_slot == -1) {
(*plugin_instance)->spec.plugin_slot = plugin_slot;
(*plugin_instance)->parent = obj;
}
@@ -3588,10 +3588,10 @@ void mjCModel::ResolvePlugin(mjCBase* obj, const std::string& plugin_name,
throw mjCError(
obj, "unrecognized name '%s' for plugin instance", plugin_instance_name.c_str());
}
if (plugin_slot != -1 && plugin_slot != (*plugin_instance)->plugin_slot) {
if (plugin_slot != -1 && plugin_slot != (*plugin_instance)->spec.plugin_slot) {
throw mjCError(
obj, "'plugin' attribute does not match that of the instance");
}
plugin_slot = (*plugin_instance)->plugin_slot;
plugin_slot = (*plugin_instance)->spec.plugin_slot;
}
}
+12 -19
View File
@@ -544,13 +544,6 @@ mjCBase::mjCBase() {
model = 0;
def = 0;
frame = nullptr;
// plugin variables
mjm_defaultPlugin(plugin);
plugin_name = "";
plugin_instance_name = "";
plugin.name = (mjString)&plugin_name;
plugin.instance_name = (mjString)&plugin_instance_name;
}
@@ -1193,7 +1186,7 @@ void mjCBody::Compile(void) {
mjCPlugin** plugin_instance = (mjCPlugin**)&plugin.instance;
model->ResolvePlugin(this, plugin_name, plugin_instance_name, plugin_instance);
const mjpPlugin* pplugin = mjp_getPluginAtSlot((*plugin_instance)->plugin_slot);
const mjpPlugin* pplugin = mjp_getPluginAtSlot((*plugin_instance)->spec.plugin_slot);
if (!(pplugin->capabilityflags & mjPLUGIN_PASSIVE)) {
throw mjCError(this, "plugin '%s' does not support passive forces", pplugin->name);
}
@@ -2047,7 +2040,7 @@ void mjCGeom::Compile(void) {
mjCPlugin** plugin_instance = (mjCPlugin**)&plugin.instance;
model->ResolvePlugin(this, plugin_name, plugin_instance_name, plugin_instance);
const mjpPlugin* pplugin = mjp_getPluginAtSlot((*plugin_instance)->plugin_slot);
const mjpPlugin* pplugin = mjp_getPluginAtSlot((*plugin_instance)->spec.plugin_slot);
if (!(pplugin->capabilityflags & mjPLUGIN_SDF)) {
throw mjCError(this, "plugin '%s' does not support sign distance fields", pplugin->name);
}
@@ -4487,7 +4480,7 @@ void mjCActuator::Compile(void) {
mjCPlugin** plugin_instance = (mjCPlugin**)&plugin.instance;
model->ResolvePlugin(this, plugin_name, plugin_instance_name, plugin_instance);
const mjpPlugin* pplugin = mjp_getPluginAtSlot((*plugin_instance)->plugin_slot);
const mjpPlugin* pplugin = mjp_getPluginAtSlot((*plugin_instance)->spec.plugin_slot);
if (!(pplugin->capabilityflags & mjPLUGIN_ACTUATOR)) {
throw mjCError(this, "plugin '%s' does not support actuators", pplugin->name);
}
@@ -4921,7 +4914,7 @@ void mjCSensor::Compile(void) {
{
mjCPlugin** plugin_instance = (mjCPlugin**)&plugin.instance;
model->ResolvePlugin(this, plugin_name, plugin_instance_name, plugin_instance);
const mjpPlugin* pplugin = mjp_getPluginAtSlot((*plugin_instance)->plugin_slot);
const mjpPlugin* pplugin = mjp_getPluginAtSlot((*plugin_instance)->spec.plugin_slot);
if (!(pplugin->capabilityflags & mjPLUGIN_SENSOR)) {
throw mjCError(this, "plugin '%s' does not support sensors", pplugin->name);
}
@@ -5332,24 +5325,24 @@ void mjCKey::Compile(const mjModel* m) {
// initialize defaults
mjCPlugin::mjCPlugin(mjCModel* _model) {
name = "";
plugin_slot = -1;
nstate = 0;
nstate = -1;
parent = this;
model = _model;
name.clear();
instance_name.clear();
// public interface
mjm_defaultPlugin(plugin);
plugin_name = "";
plugin_instance_name = "";
plugin.name = (mjString)&plugin_name;
plugin.instance_name = (mjString)&plugin_instance_name;
mjm_defaultPlugin(spec);
spec.name = (mjString)&name;
spec.instance_name = (mjString)&instance_name;
spec.info = (mjString)&info;
}
// compiler
void mjCPlugin::Compile(void) {
const mjpPlugin* plugin = mjp_getPluginAtSlot(this->plugin_slot);
const mjpPlugin* plugin = mjp_getPluginAtSlot(spec.plugin_slot);
// concatenate all of the plugin's attribute values (as null-terminated strings) into
// flattened_attributes, in the order declared in the mjpPlugin
+13 -10
View File
@@ -173,10 +173,6 @@ class mjCBase {
mjCModel* model; // pointer to model that created object
mjCFrame* frame; // pointer to frame transformation
// plugin support
mjmPlugin plugin;
std::string plugin_name;
std::string plugin_instance_name;
protected:
mjCBase(); // constructor
virtual ~mjCBase() = default; // destructor
@@ -233,7 +229,6 @@ class mjCBody : public mjCBase, private mjmBody {
using mjCBase::name;
using mjCBase::classname;
using mjCBase::info;
using mjCBase::plugin;
// used by mjXWriter and mjCModel
const std::vector<double>& get_userdata() { return userdata_; }
@@ -278,6 +273,8 @@ class mjCBody : public mjCBase, private mjmBody {
void PointToLocal(void);
// variable-size data
std::string plugin_name;
std::string plugin_instance_name;
std::vector<double> userdata_;
std::vector<double> spec_userdata_;
};
@@ -415,6 +412,8 @@ class mjCGeom : public mjCBase, private mjmGeom {
mjtNum fluid[mjNFLUID]; // compile-time fluid-interaction parameters
// variable-size data
std::string plugin_name;
std::string plugin_instance_name;
std::string hfieldname_;
std::string meshname_;
std::string material_;
@@ -427,7 +426,6 @@ class mjCGeom : public mjCBase, private mjmGeom {
// inherited
using mjCBase::classname;
using mjCBase::info;
using mjCBase::plugin;
};
@@ -625,7 +623,6 @@ class mjCMesh: public mjCBase, private mjmMesh {
mjmMesh spec;
using mjCBase::name;
using mjCBase::classname;
using mjCBase::plugin;
using mjCBase::info;
void CopyFromSpec(void);
@@ -687,6 +684,9 @@ class mjCMesh: public mjCBase, private mjmMesh {
private:
// variable size attributes
std::string plugin_name;
std::string plugin_instance_name;
std::string content_type_; // content type of file
std::string file_; // mesh file
std::vector<float> uservert_; // user vertex data
@@ -1164,7 +1164,7 @@ class mjCPlugin : public mjCBase {
friend class mjXWriter;
public:
int plugin_slot; // global registered slot number of the plugin
mjmPlugin spec;
int nstate; // state size for the plugin instance
mjCBase* parent; // parent object (only used when generating error message)
std::map<std::string, std::string, std::less<>> config_attribs; // raw config attributes from XML
@@ -1173,6 +1173,7 @@ class mjCPlugin : public mjCBase {
private:
mjCPlugin(mjCModel*); // constructor
void Compile(void); // compiler
std::string instance_name;
};
@@ -1190,7 +1191,6 @@ class mjCActuator : public mjCBase, private mjmActuator {
using mjCBase::name;
using mjCBase::classname;
using mjCBase::info;
using mjCBase::plugin;
// used by mjXWriter and mjCModel
const std::vector<double>& get_userdata() { return userdata_; }
@@ -1211,6 +1211,8 @@ class mjCActuator : public mjCBase, private mjmActuator {
int trnid[2]; // id of transmission target
// variable-size data
std::string plugin_name;
std::string plugin_instance_name;
std::string target_;
std::string slidersite_;
std::string refsite_;
@@ -1236,7 +1238,6 @@ class mjCSensor : public mjCBase, private mjmSensor {
using mjCBase::name;
using mjCBase::classname;
using mjCBase::info;
using mjCBase::plugin;
// used by mjXWriter and mjCModel
const std::vector<double>& get_userdata() { return userdata_; }
@@ -1253,6 +1254,8 @@ class mjCSensor : public mjCBase, private mjmSensor {
int refid; // id of reference frame
// variable-size data
std::string plugin_name;
std::string plugin_instance_name;
std::string objname_;
std::string refname_;
std::vector<double> userdata_;