Create mjpDecoder, mj_parse, and mju_decodeResource

- plugin system similar to mjpResourceProvider, but instead of loading a resource it converts an existing mjResource into an mjSpec.
  - The returned spec is then composed into the referencing spec.
  - This enables different file types to generate arbitrary specs, and allows us to separate format parsing from compilation code.

Follow up CLs will move some of the logic in src/engine for PNG, USD, KTX, OBJ loading into decoders.

The mj_parse function MjSpec from a given file, it's a more generic version of mj_parseXML.

In it's implementation, mj_parse as opposed to mj_parseXML will look for any registered decoder and
not assume we are striclty dealing with MJCF.

PiperOrigin-RevId: 826149497
Change-Id: I0ece26904280cb94bd5ded6dd5a565c539d60254
This commit is contained in:
Sam Haves
2025-10-30 12:53:40 -07:00
committed by Copybara-Service
parent f2badc05ac
commit 57f7145806
16 changed files with 2063 additions and 1555 deletions
+44
View File
@@ -48,6 +48,17 @@ Parse spec from XML string.
*Nullable:* ``vfs``, ``error``
.. _mj_parse:
`mj_parse <#mj_parse>`__
~~~~~~~~~~~~~~~~~~~~~~~~
.. mujoco-include:: mj_parse
Parse spec from a file.
*Nullable:* ``vfs``, ``error``
.. _mj_compile:
`mj_compile <#mj_compile>`__
@@ -2926,6 +2937,39 @@ Look up a resource provider by slot number returned by mjp_registerResourceProvi
If invalid slot number, return NULL.
.. _mjp_registerDecoder:
`mjp_registerDecoder <#mjp_registerDecoder>`__
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. mujoco-include:: mjp_registerDecoder
Globally register a decoder. This function is thread-safe.
If an identical mjpDecoder is already registered, this function does nothing.
If a non-identical mjpDecoder with the same name is already registered, an mju_error is raised.
.. _mjp_defaultDecoder:
`mjp_defaultDecoder <#mjp_defaultDecoder>`__
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. mujoco-include:: mjp_defaultDecoder
Set default resource decoder definition.
.. _mjp_findDecoder:
`mjp_findDecoder <#mjp_findDecoder>`__
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. mujoco-include:: mjp_findDecoder
Return the resource provider with the prefix that matches against the resource name.
If no match, return NULL.
.. _Thread:
Threads