Move mj_loadModel to xml_api.cc.
PiperOrigin-RevId: 635748029 Change-Id: Ie4c7d34c9738e5497ec700089d4dba780ba7d5ed
This commit is contained in:
committed by
Copybara-Service
parent
f0b633de6a
commit
2f19941fcf
+2
-36
@@ -27,13 +27,11 @@
|
|||||||
#include <mujoco/mjplugin.h>
|
#include <mujoco/mjplugin.h>
|
||||||
#include <mujoco/mjxmacro.h>
|
#include <mujoco/mjxmacro.h>
|
||||||
#include "engine/engine_crossplatform.h"
|
#include "engine/engine_crossplatform.h"
|
||||||
#include "engine/engine_resource.h"
|
|
||||||
#include "engine/engine_macro.h"
|
#include "engine/engine_macro.h"
|
||||||
#include "engine/engine_plugin.h"
|
#include "engine/engine_plugin.h"
|
||||||
#include "engine/engine_util_blas.h"
|
#include "engine/engine_util_blas.h"
|
||||||
#include "engine/engine_util_errmem.h"
|
#include "engine/engine_util_errmem.h"
|
||||||
#include "engine/engine_util_misc.h"
|
#include "engine/engine_util_misc.h"
|
||||||
#include "engine/engine_vfs.h"
|
|
||||||
#include "thread/thread_pool.h"
|
#include "thread/thread_pool.h"
|
||||||
|
|
||||||
#ifdef ADDRESS_SANITIZER
|
#ifdef ADDRESS_SANITIZER
|
||||||
@@ -714,36 +712,17 @@ void mj_saveModel(const mjModel* m, const char* filename, void* buffer, int buff
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// load binary MJB model
|
||||||
// load model from binary MJB resource
|
mjModel* mj_loadModelBuffer(const void* buffer, int buffer_sz) {
|
||||||
mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
|
|
||||||
int header[NHEADER] = {0};
|
int header[NHEADER] = {0};
|
||||||
int expected_header[NHEADER] = {ID, sizeof(mjtNum), getnint(), getnsize(), getnptr()};
|
int expected_header[NHEADER] = {ID, sizeof(mjtNum), getnint(), getnsize(), getnptr()};
|
||||||
int ints[256];
|
int ints[256];
|
||||||
size_t sizes[8];
|
size_t sizes[8];
|
||||||
int ptrbuf = 0;
|
int ptrbuf = 0;
|
||||||
mjModel *m = 0;
|
mjModel *m = 0;
|
||||||
mjResource* r = NULL;
|
|
||||||
|
|
||||||
// first try vfs, otherwise try a provider or OS filesystem
|
|
||||||
if (!(r = mju_openVfsResource(filename, vfs))) {
|
|
||||||
char error[1024];
|
|
||||||
if (!(r = mju_openResource(filename, error, 1024))) {
|
|
||||||
mju_warning("%s", error);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const void* buffer = NULL;
|
|
||||||
int buffer_sz = mju_readResource(r, &buffer);
|
|
||||||
if (buffer_sz <= 0) {
|
|
||||||
mju_closeResource(r);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buffer_sz < NHEADER*sizeof(int)) {
|
if (buffer_sz < NHEADER*sizeof(int)) {
|
||||||
mju_warning("Model file has an incomplete header");
|
mju_warning("Model file has an incomplete header");
|
||||||
mju_closeResource(r);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -755,27 +734,22 @@ mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
|
|||||||
switch (i) {
|
switch (i) {
|
||||||
case 0:
|
case 0:
|
||||||
mju_warning("Model missing header ID");
|
mju_warning("Model missing header ID");
|
||||||
mju_closeResource(r);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
mju_warning("Model and executable have different floating point precision");
|
mju_warning("Model and executable have different floating point precision");
|
||||||
mju_closeResource(r);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
mju_warning("Model and executable have different number of ints in mjModel");
|
mju_warning("Model and executable have different number of ints in mjModel");
|
||||||
mju_closeResource(r);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
mju_warning("Model and executable have different number of size_t members in mjModel");
|
mju_warning("Model and executable have different number of size_t members in mjModel");
|
||||||
mju_closeResource(r);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
mju_warning("Model and executable have different number of pointers in mjModel");
|
mju_warning("Model and executable have different number of pointers in mjModel");
|
||||||
mju_closeResource(r);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -783,7 +757,6 @@ mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
|
|||||||
|
|
||||||
// read mjModel structure: info only
|
// read mjModel structure: info only
|
||||||
if (ptrbuf + sizeof(int)*getnint() + sizeof(size_t)*getnsize() > buffer_sz) {
|
if (ptrbuf + sizeof(int)*getnint() + sizeof(size_t)*getnsize() > buffer_sz) {
|
||||||
mju_closeResource(r);
|
|
||||||
mju_warning("Truncated model file - ran out of data while reading sizes");
|
mju_warning("Truncated model file - ran out of data while reading sizes");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -802,7 +775,6 @@ mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
|
|||||||
ints[56], ints[57], ints[58], ints[59], ints[60], ints[61], ints[62],
|
ints[56], ints[57], ints[58], ints[59], ints[60], ints[61], ints[62],
|
||||||
ints[63]);
|
ints[63]);
|
||||||
if (!m || m->nbuffer != sizes[getnsize()-1]) {
|
if (!m || m->nbuffer != sizes[getnsize()-1]) {
|
||||||
mju_closeResource(r);
|
|
||||||
mju_warning("Corrupted model, wrong size parameters");
|
mju_warning("Corrupted model, wrong size parameters");
|
||||||
mj_deleteModel(m);
|
mj_deleteModel(m);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -820,7 +792,6 @@ mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
|
|||||||
|
|
||||||
// read options and buffer
|
// read options and buffer
|
||||||
if (ptrbuf + sizeof(mjOption) + sizeof(mjVisual) + sizeof(mjStatistic) > buffer_sz) {
|
if (ptrbuf + sizeof(mjOption) + sizeof(mjVisual) + sizeof(mjStatistic) > buffer_sz) {
|
||||||
mju_closeResource(r);
|
|
||||||
mju_warning("Truncated model file - ran out of data while reading structs");
|
mju_warning("Truncated model file - ran out of data while reading structs");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -831,7 +802,6 @@ mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
|
|||||||
MJMODEL_POINTERS_PREAMBLE(m)
|
MJMODEL_POINTERS_PREAMBLE(m)
|
||||||
#define X(type, name, nr, nc) \
|
#define X(type, name, nr, nc) \
|
||||||
if (ptrbuf + sizeof(type) * (m->nr) * (nc) > buffer_sz) { \
|
if (ptrbuf + sizeof(type) * (m->nr) * (nc) > buffer_sz) { \
|
||||||
mju_closeResource(r); \
|
|
||||||
mju_warning( \
|
mju_warning( \
|
||||||
"Truncated model file - ran out of data while reading " #name); \
|
"Truncated model file - ran out of data while reading " #name); \
|
||||||
mj_deleteModel(m); \
|
mj_deleteModel(m); \
|
||||||
@@ -845,7 +815,6 @@ mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
|
|||||||
|
|
||||||
// make sure buffer is the correct size
|
// make sure buffer is the correct size
|
||||||
if (ptrbuf != buffer_sz) {
|
if (ptrbuf != buffer_sz) {
|
||||||
mju_closeResource(r);
|
|
||||||
mju_warning("Model file is too large");
|
mju_warning("Model file is too large");
|
||||||
mj_deleteModel(m);
|
mj_deleteModel(m);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -853,18 +822,15 @@ mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
|
|||||||
|
|
||||||
const char* validationError = mj_validateReferences(m);
|
const char* validationError = mj_validateReferences(m);
|
||||||
if (validationError) {
|
if (validationError) {
|
||||||
mju_closeResource(r);
|
|
||||||
mju_warning("%s", validationError);
|
mju_warning("%s", validationError);
|
||||||
mj_deleteModel(m);
|
mj_deleteModel(m);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mju_closeResource(r);
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// de-allocate mjModel
|
// de-allocate mjModel
|
||||||
void mj_deleteModel(mjModel* m) {
|
void mj_deleteModel(mjModel* m) {
|
||||||
if (m) {
|
if (m) {
|
||||||
|
|||||||
@@ -71,9 +71,8 @@ MJAPI mjModel* mj_copyModel(mjModel* dest, const mjModel* src);
|
|||||||
// save model to binary file
|
// save model to binary file
|
||||||
MJAPI void mj_saveModel(const mjModel* m, const char* filename, void* buffer, int buffer_sz);
|
MJAPI void mj_saveModel(const mjModel* m, const char* filename, void* buffer, int buffer_sz);
|
||||||
|
|
||||||
// load model from binary MJB file
|
// load binary MJB
|
||||||
// if vfs is not NULL, look up file in vfs before reading from disk
|
mjModel* mj_loadModelBuffer(const void* buffer, int buffer_sz);
|
||||||
MJAPI mjModel* mj_loadModel(const char* filename, const mjVFS* vfs);
|
|
||||||
|
|
||||||
// de-allocate model
|
// de-allocate model
|
||||||
MJAPI void mj_deleteModel(mjModel* m);
|
MJAPI void mj_deleteModel(mjModel* m);
|
||||||
|
|||||||
@@ -26,6 +26,9 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
#include <mujoco/mjmodel.h>
|
#include <mujoco/mjmodel.h>
|
||||||
|
#include "engine/engine_io.h"
|
||||||
|
#include "engine/engine_resource.h"
|
||||||
|
#include "engine/engine_vfs.h"
|
||||||
#include "user/user_api.h"
|
#include "user/user_api.h"
|
||||||
#include "xml/xml.h"
|
#include "xml/xml.h"
|
||||||
#include "xml/xml_native_reader.h"
|
#include "xml/xml_native_reader.h"
|
||||||
@@ -178,3 +181,31 @@ int mj_printSchema(const char* filename, char* buffer, int buffer_sz, int flg_ht
|
|||||||
// return string length
|
// return string length
|
||||||
return str.str().size();
|
return str.str().size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// load model from binary MJB resource
|
||||||
|
mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
|
||||||
|
mjResource* resource = nullptr;
|
||||||
|
|
||||||
|
// first try vfs, otherwise try a provider or OS filesystem
|
||||||
|
if (!(resource = mju_openVfsResource(filename, vfs))) {
|
||||||
|
char error[1024];
|
||||||
|
if (!(resource = mju_openResource(filename, error, 1024))) {
|
||||||
|
mju_warning("%s", error);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const void* buffer = NULL;
|
||||||
|
int buffer_sz = mju_readResource(resource, &buffer);
|
||||||
|
if (buffer_sz < 1) {
|
||||||
|
mju_closeResource(resource);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
mjModel* m = mj_loadModelBuffer(buffer, buffer_sz);
|
||||||
|
mju_closeResource(resource);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,9 @@ MJAPI void mj_freeLastXML(void);
|
|||||||
MJAPI int mj_printSchema(const char* filename, char* buffer, int buffer_sz,
|
MJAPI int mj_printSchema(const char* filename, char* buffer, int buffer_sz,
|
||||||
int flg_html, int flg_pad);
|
int flg_html, int flg_pad);
|
||||||
|
|
||||||
|
// load model from binary MJB file
|
||||||
|
// if vfs is not NULL, look up file in vfs before reading from disk
|
||||||
|
MJAPI mjModel* mj_loadModel(const char* filename, const mjVFS* vfs);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user