Do not expose plugin_slot.

PiperOrigin-RevId: 683215401
Change-Id: Ic64f7221ed83ca3b0c8cca16eb680ea67c67b564
This commit is contained in:
Alessio Quaglino
2024-10-07 09:36:36 -07:00
committed by Copybara-Service
parent 66faba9aa5
commit 1f9dca8bc4
17 changed files with 50 additions and 49 deletions
+1 -3
View File
@@ -206,16 +206,14 @@ void mjs_addSpec(mjSpec* s, mjSpec* child) {
// activate plugin
int mjs_activatePlugin(mjSpec* s, const char* name) {
void mjs_activatePlugin(mjSpec* s, const char* name) {
int plugin_slot = -1;
const mjpPlugin* plugin = mjp_getPlugin(name, &plugin_slot);
if (!plugin) {
mju_error("unknown plugin '%s'", name);
return -1;
}
mjCModel* model = static_cast<mjCModel*>(s->element);
model->ActivatePlugin(plugin, plugin_slot);
return plugin_slot;
}
+2 -2
View File
@@ -63,8 +63,8 @@ MJAPI void mj_deleteSpec(mjSpec* s);
// Add spec (model asset) to spec.
MJAPI void mjs_addSpec(mjSpec* s, mjSpec* child);
// Activate plugin, return slot number.
MJAPI int mjs_activatePlugin(mjSpec* s, const char* name);
// Activate plugin.
MJAPI void mjs_activatePlugin(mjSpec* s, const char* name);
//---------------------------------- Attachment ----------------------------------------------------
-1
View File
@@ -402,6 +402,5 @@ void mjs_defaultKey(mjsKey* key) {
// default plugin attributes
void mjs_defaultPlugin(mjsPlugin* plugin) {
memset(plugin, 0, sizeof(mjsPlugin));
plugin->plugin_slot = -1;
}
+1 -1
View File
@@ -294,7 +294,7 @@ void mjCMesh::LoadSDF() {
mjCPlugin* plugin_instance = static_cast<mjCPlugin*>(plugin.element);
model->ResolvePlugin(this, plugin_name, plugin_instance_name, &plugin_instance);
plugin.element = plugin_instance;
const mjpPlugin* pplugin = mjp_getPluginAtSlot(plugin_instance->spec.plugin_slot);
const mjpPlugin* pplugin = mjp_getPluginAtSlot(plugin_instance->plugin_slot);
if (!(pplugin->capabilityflags & mjPLUGIN_SDF)) {
throw mjCError(this, "plugin '%s' does not support signed distance fields", pplugin->name);
}
+23 -8
View File
@@ -315,6 +315,7 @@ void mjCModel::CopyPlugin(std::vector<mjCPlugin*>& dest,
continue;
}
mjCPlugin* candidate = new mjCPlugin(*plugin);
candidate->model = this;
candidate->NameSpace(plugin->model);
bool referenced = instances.find(candidate->name) != instances.end();
auto same_name = [candidate](const mjCPlugin* dest) { return dest->name == candidate->name; };
@@ -3973,7 +3974,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]->spec.plugin_slot;
m->plugin[i] = plugins_[i]->plugin_slot;
const int size = plugins_[i]->flattened_attributes.size();
std::memcpy(m->plugin_attr + adr,
plugins_[i]->flattened_attributes.data(), size);
@@ -4499,24 +4500,37 @@ void mjCModel::ActivatePlugin(const mjpPlugin* plugin, int slot) {
void mjCModel::ResolvePlugin(mjCBase* obj, const std::string& plugin_name,
const std::string& plugin_instance_name, mjCPlugin** plugin_instance) {
std::string pname = plugin_name;
// if the plugin name is not specified by the user, infer it from the plugin instance
if (plugin_name.empty() && !plugin_instance_name.empty()) {
mjCBase* plugin_obj = FindObject(mjOBJ_PLUGIN, plugin_instance_name);
if (plugin_obj) {
pname = static_cast<mjCPlugin*>(plugin_obj)->plugin_name;
} else {
throw mjCError(obj, "unrecognized name '%s' for plugin instance",
plugin_instance_name.c_str());
}
}
// if plugin_name is specified, check if it is in the list of active plugins
// (in XML, active plugins are those declared as <required>)
int plugin_slot = -1;
if (!plugin_name.empty()) {
if (!pname.empty()) {
for (int i = 0; i < active_plugins_.size(); ++i) {
if (active_plugins_[i].first->name == plugin_name) {
if (active_plugins_[i].first->name == pname) {
plugin_slot = active_plugins_[i].second;
break;
}
}
if (plugin_slot == -1) {
throw mjCError(obj, "unrecognized plugin '%s'", plugin_name.c_str());
throw mjCError(obj, "unrecognized plugin '%s'", pname.c_str());
}
}
// implicit plugin instance
if (*plugin_instance && (*plugin_instance)->spec.plugin_slot == -1) {
(*plugin_instance)->spec.plugin_slot = plugin_slot;
if (*plugin_instance && (*plugin_instance)->plugin_slot == -1) {
(*plugin_instance)->plugin_slot = plugin_slot;
(*plugin_instance)->parent = obj;
}
@@ -4524,14 +4538,15 @@ void mjCModel::ResolvePlugin(mjCBase* obj, const std::string& plugin_name,
else if (!*plugin_instance) {
*plugin_instance =
static_cast<mjCPlugin*>(FindObject(mjOBJ_PLUGIN, plugin_instance_name));
(*plugin_instance)->plugin_slot = plugin_slot;
if (!*plugin_instance) {
throw mjCError(
obj, "unrecognized name '%s' for plugin instance", plugin_instance_name.c_str());
}
if (plugin_slot != -1 && plugin_slot != (*plugin_instance)->spec.plugin_slot) {
if (plugin_slot != -1 && plugin_slot != (*plugin_instance)->plugin_slot) {
throw mjCError(
obj, "'plugin' attribute does not match that of the instance");
}
plugin_slot = (*plugin_instance)->spec.plugin_slot;
plugin_slot = (*plugin_instance)->plugin_slot;
}
}
+9 -5
View File
@@ -1695,7 +1695,7 @@ void mjCBody::Compile(void) {
mjCPlugin* plugin_instance = static_cast<mjCPlugin*>(plugin.element);
model->ResolvePlugin(this, plugin_name, plugin_instance_name, &plugin_instance);
plugin.element = plugin_instance;
const mjpPlugin* pplugin = mjp_getPluginAtSlot(plugin_instance->spec.plugin_slot);
const mjpPlugin* pplugin = mjp_getPluginAtSlot(plugin_instance->plugin_slot);
if (!(pplugin->capabilityflags & mjPLUGIN_PASSIVE)) {
throw mjCError(this, "plugin '%s' does not support passive forces", pplugin->name);
}
@@ -2949,7 +2949,7 @@ void mjCGeom::Compile(void) {
mjCPlugin* plugin_instance = static_cast<mjCPlugin*>(plugin.element);
model->ResolvePlugin(this, plugin_name, plugin_instance_name, &plugin_instance);
plugin.element = plugin_instance;
const mjpPlugin* pplugin = mjp_getPluginAtSlot(plugin_instance->spec.plugin_slot);
const mjpPlugin* pplugin = mjp_getPluginAtSlot(plugin_instance->plugin_slot);
if (!(pplugin->capabilityflags & mjPLUGIN_SDF)) {
throw mjCError(this, "plugin '%s' does not support sign distance fields", pplugin->name);
}
@@ -5908,7 +5908,7 @@ void mjCActuator::Compile(void) {
mjCPlugin* plugin_instance = static_cast<mjCPlugin*>(plugin.element);
model->ResolvePlugin(this, plugin_name, plugin_instance_name, &plugin_instance);
plugin.element = plugin_instance;
const mjpPlugin* pplugin = mjp_getPluginAtSlot(plugin_instance->spec.plugin_slot);
const mjpPlugin* pplugin = mjp_getPluginAtSlot(plugin_instance->plugin_slot);
if (!(pplugin->capabilityflags & mjPLUGIN_ACTUATOR)) {
throw mjCError(this, "plugin '%s' does not support actuators", pplugin->name);
}
@@ -6415,7 +6415,7 @@ void mjCSensor::Compile(void) {
mjCPlugin* plugin_instance = static_cast<mjCPlugin*>(plugin.element);
model->ResolvePlugin(this, plugin_name, plugin_instance_name, &plugin_instance);
plugin.element = plugin_instance;
const mjpPlugin* pplugin = mjp_getPluginAtSlot(plugin_instance->spec.plugin_slot);
const mjpPlugin* pplugin = mjp_getPluginAtSlot(plugin_instance->plugin_slot);
if (!(pplugin->capabilityflags & mjPLUGIN_SENSOR)) {
throw mjCError(this, "plugin '%s' does not support sensors", pplugin->name);
}
@@ -6918,6 +6918,7 @@ void mjCKey::Compile(const mjModel* m) {
mjCPlugin::mjCPlugin(mjCModel* _model) {
name = "";
nstate = -1;
plugin_slot = -1;
parent = this;
model = _model;
name.clear();
@@ -6945,6 +6946,7 @@ mjCPlugin& mjCPlugin::operator=(const mjCPlugin& other) {
this->spec = other.spec;
*static_cast<mjCPlugin_*>(this) = static_cast<const mjCPlugin_&>(other);
parent = this;
plugin_slot = other.plugin_slot;
}
return *this;
}
@@ -6953,7 +6955,9 @@ mjCPlugin& mjCPlugin::operator=(const mjCPlugin& other) {
// compiler
void mjCPlugin::Compile(void) {
const mjpPlugin* plugin = mjp_getPluginAtSlot(spec.plugin_slot);
mjCPlugin* plugin_instance = this;
model->ResolvePlugin(this, plugin_name, name, &plugin_instance);
const mjpPlugin* plugin = mjp_getPluginAtSlot(plugin_slot);
// clear precompiled
flattened_attributes.clear();
+2 -1
View File
@@ -1424,7 +1424,8 @@ class mjCPlugin : public mjCPlugin_ {
mjCPlugin(const mjCPlugin& other);
mjCPlugin& operator=(const mjCPlugin& other);
mjsPlugin spec;
mjCBase* parent; // parent object (only used when generating error message)
mjCBase* parent; // parent object (only used when generating error message)
int plugin_slot; // global registered slot number of the plugin
private:
void Compile(void); // compiler
+1 -2
View File
@@ -2890,7 +2890,7 @@ void mjXReader::Extension(XMLElement* section) {
if (name == "plugin") {
string plugin_name;
ReadAttrTxt(elem, "plugin", plugin_name, /* required = */ true);
int plugin_slot = mjs_activatePlugin(spec, plugin_name.c_str());
mjs_activatePlugin(spec, plugin_name.c_str());
XMLElement* child = FirstChildElement(elem);
while (child) {
@@ -2909,7 +2909,6 @@ void mjXReader::Extension(XMLElement* section) {
throw mjXError(child, "plugin instance must have a name");
}
ReadPluginConfigs(child, p);
p->plugin_slot = plugin_slot;
}
child = NextSiblingElement(child);
}
+2 -2
View File
@@ -827,7 +827,7 @@ void mjXWriter::OnePlugin(XMLElement* elem, const mjsPlugin* plugin) {
} else {
WriteAttrTxt(elem, "plugin", plugin_name);
const mjpPlugin* pplugin = mjp_getPluginAtSlot(
static_cast<mjCPlugin*>(plugin->element)->spec.plugin_slot);
static_cast<mjCPlugin*>(plugin->element)->plugin_slot);
const char* c = &(static_cast<mjCPlugin*>(plugin->element)->flattened_attributes[0]);
for (int i = 0; i < pplugin->nattribute; ++i) {
string value(c);
@@ -1338,7 +1338,7 @@ void mjXWriter::Extension(XMLElement* root) {
}
// check if we need to open a new <plugin> section
const mjpPlugin* plugin = mjp_getPluginAtSlot(pp->spec.plugin_slot);
const mjpPlugin* plugin = mjp_getPluginAtSlot(pp->plugin_slot);
if (plugin != last_plugin) {
plugin_elem = InsertEnd(section, "plugin");
WriteAttrTxt(plugin_elem, "plugin", plugin->name);