Introduce mjpEncoder plugin architecture
Add a new mjpEncoder plugin type mirroring the existing mjpDecoder pattern. Encoders serialize an mjSpec + mjModel to an mjResource for a given format. New API functions: - mjp_registerEncoder: globally register an encoder - mjp_defaultEncoder: zero-initialize an encoder struct - mjp_findEncoder: look up an encoder by filename extension or content type The mjfEncode callback takes (mjSpec*, mjModel*, mjVFS*, mjResource*) and returns 0 on success. Writing to mjResource keeps symmetry with the decoder reading from mjResource and leaves the door open for writable resource providers. PiperOrigin-RevId: 889187898 Change-Id: I180771b2255b91dea188ac5e2cdc3a8f0fb85364
This commit is contained in:
committed by
Copybara-Service
parent
2d33b50243
commit
f5d3ce3451
@@ -1686,6 +1686,13 @@ struct mjpDecoder {
|
||||
// for cleaning it up
|
||||
};
|
||||
typedef struct mjpDecoder mjpDecoder;
|
||||
struct mjpEncoder {
|
||||
const char* content_type;
|
||||
const char* extension;
|
||||
mjfEncode encode;
|
||||
mjfCloseResource close_resource;
|
||||
};
|
||||
typedef struct mjpEncoder mjpEncoder;
|
||||
typedef enum mjtPluginCapabilityBit_ {
|
||||
mjPLUGIN_ACTUATOR = 1<<0, // actuator forces
|
||||
mjPLUGIN_SENSOR = 1<<1, // sensor measurements
|
||||
@@ -3155,6 +3162,9 @@ mjSpec* mj_parseXML(const char* filename, const mjVFS* vfs, char* error, int err
|
||||
mjSpec* mj_parseXMLString(const char* xml, const mjVFS* vfs, char* error, int error_sz);
|
||||
mjSpec* mj_parse(const char* filename, const char* content_type,
|
||||
const mjVFS* vfs, char* error, int error_sz);
|
||||
int mj_encode(const mjSpec* s, const mjModel* m, const char* filename,
|
||||
const char* content_type, const mjVFS* vfs, char* error,
|
||||
int error_sz);
|
||||
mjModel* mj_compile(mjSpec* s, const mjVFS* vfs);
|
||||
int mj_copyBack(mjSpec* s, const mjModel* m);
|
||||
int mj_recompile(mjSpec* s, const mjVFS* vfs, mjModel* m, mjData* d);
|
||||
@@ -3591,6 +3601,9 @@ const mjpResourceProvider* mjp_getResourceProviderAtSlot(int slot);
|
||||
void mjp_registerDecoder(const mjpDecoder* decoder);
|
||||
void mjp_defaultDecoder(mjpDecoder* decoder);
|
||||
const mjpDecoder* mjp_findDecoder(const mjResource* resource, const char* content_type);
|
||||
void mjp_registerEncoder(const mjpEncoder* encoder);
|
||||
void mjp_defaultEncoder(mjpEncoder* encoder);
|
||||
const mjpEncoder* mjp_findEncoder(const char* filename, const char* content_type);
|
||||
mjResource* mju_openResource(const char* dir, const char* name,
|
||||
const mjVFS* vfs, char* error, size_t nerror);
|
||||
void mju_closeResource(mjResource* resource);
|
||||
|
||||
Reference in New Issue
Block a user