Add VFS parameter to mjpDecoder decoding function.
PiperOrigin-RevId: 846242734 Change-Id: I317e11e6fcd965f66416abcf690a3a65d043e9ee
This commit is contained in:
committed by
Copybara-Service
parent
bebdd62943
commit
05e1c452c7
@@ -69,7 +69,7 @@ typedef struct mjpResourceProvider mjpResourceProvider;
|
|||||||
|
|
||||||
// function pointer types
|
// function pointer types
|
||||||
// return an mjSpec representing the decoded resource.
|
// return an mjSpec representing the decoded resource.
|
||||||
typedef mjSpec* (*mjfDecode)(mjResource* resource);
|
typedef mjSpec* (*mjfDecode)(mjResource* resource, const mjVFS* vfs);
|
||||||
// return true if the given resource can be decoded.
|
// return true if the given resource can be decoded.
|
||||||
typedef int (*mjfCanDecode)(const mjResource* resource);
|
typedef int (*mjfCanDecode)(const mjResource* resource);
|
||||||
|
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ mjSpec* mj_parse(const char* filename, const char* content_type,
|
|||||||
memcpy(resource->name, fullname.c_str(), sizeof(char) * (n + 1));
|
memcpy(resource->name, fullname.c_str(), sizeof(char) * (n + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
mjSpec* spec = mju_decodeResource(resource, content_type);
|
mjSpec* spec = mju_decodeResource(resource, content_type, vfs);
|
||||||
mju_closeResource(resource);
|
mju_closeResource(resource);
|
||||||
return spec;
|
return spec;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -265,7 +265,7 @@ int mju_isModifiedResource(const mjResource* resource, const char* timestamp) {
|
|||||||
return FileModified(resource, timestamp);
|
return FileModified(resource, timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
mjSpec* mju_decodeResource(mjResource* resource, const char* content_type) {
|
mjSpec* mju_decodeResource(mjResource* resource, const char* content_type, const mjVFS* vfs) {
|
||||||
const mjpDecoder* decoder = nullptr;
|
const mjpDecoder* decoder = nullptr;
|
||||||
if (content_type) {
|
if (content_type) {
|
||||||
decoder = mjp_findDecoder(resource, content_type);
|
decoder = mjp_findDecoder(resource, content_type);
|
||||||
@@ -276,6 +276,6 @@ mjSpec* mju_decodeResource(mjResource* resource, const char* content_type) {
|
|||||||
mju_error("Could not find decoder for resource '%s'", resource->name);
|
mju_error("Could not find decoder for resource '%s'", resource->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return decoder->decode(resource);
|
return decoder->decode(resource, vfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,8 @@ MJAPI int mju_isModifiedResource(const mjResource* resource, const char* timesta
|
|||||||
|
|
||||||
// given a resource, find its decoder and return the decoded spec
|
// given a resource, find its decoder and return the decoded spec
|
||||||
// the caller takes ownership of the spec and is responsible for cleaning it up
|
// the caller takes ownership of the spec and is responsible for cleaning it up
|
||||||
MJAPI mjSpec* mju_decodeResource(mjResource* resource, const char* content_type);
|
MJAPI mjSpec* mju_decodeResource(mjResource* resource, const char* content_type,
|
||||||
|
const mjVFS* vfs);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,9 @@ static mjSpec* MakeSimpleSpec() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Always returns a simple mjSpec, ignoring the resource.
|
// Always returns a simple mjSpec, ignoring the resource.
|
||||||
mjSpec* FakeDecode(mjResource* resource) { return MakeSimpleSpec(); }
|
mjSpec* FakeDecode(mjResource* resource, const mjVFS* vfs) {
|
||||||
|
return MakeSimpleSpec();
|
||||||
|
}
|
||||||
|
|
||||||
// Can decode any resource that has a .fakeformat extension.
|
// Can decode any resource that has a .fakeformat extension.
|
||||||
int FakeCanDecode(const mjResource* resource) {
|
int FakeCanDecode(const mjResource* resource) {
|
||||||
@@ -81,8 +83,7 @@ TEST_F(DecoderPluginTest, CanDecode) {
|
|||||||
|
|
||||||
// Check referencing a resource via XML invokes the decoder.
|
// Check referencing a resource via XML invokes the decoder.
|
||||||
char error[1024];
|
char error[1024];
|
||||||
mjSpec* spec =
|
mjSpec* spec = mj_parseXMLString(xml, nullptr, error, sizeof(error));
|
||||||
mj_parseXMLString(xml, nullptr, error, sizeof(error));
|
|
||||||
mjModel* model = mj_compile(spec, nullptr);
|
mjModel* model = mj_compile(spec, nullptr);
|
||||||
ASSERT_THAT(model, testing::NotNull()) << error;
|
ASSERT_THAT(model, testing::NotNull()) << error;
|
||||||
EXPECT_EQ(model->nbody, 2); // world + included body
|
EXPECT_EQ(model->nbody, 2); // world + included body
|
||||||
@@ -91,8 +92,7 @@ TEST_F(DecoderPluginTest, CanDecode) {
|
|||||||
mj_deleteSpec(spec);
|
mj_deleteSpec(spec);
|
||||||
|
|
||||||
// Check mj_parse with extension .fakeformat
|
// Check mj_parse with extension .fakeformat
|
||||||
spec =
|
spec = mj_parse("dummy.fakeformat", nullptr, nullptr, error, sizeof(error));
|
||||||
mj_parse("dummy.fakeformat", nullptr, nullptr, error, sizeof(error));
|
|
||||||
model = mj_compile(spec, nullptr);
|
model = mj_compile(spec, nullptr);
|
||||||
EXPECT_EQ(model->nbody, 2); // world + included body
|
EXPECT_EQ(model->nbody, 2); // world + included body
|
||||||
EXPECT_EQ(model->ngeom, 1);
|
EXPECT_EQ(model->ngeom, 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user