Add option to mjspec for creating a texture directly from a buffer.
PiperOrigin-RevId: 662186527 Change-Id: I469c876681d52964ac971c0bb2ec3517224d3a3d
This commit is contained in:
committed by
Copybara-Service
parent
20cae556ee
commit
851bb6eef4
+69
-25
@@ -15,6 +15,8 @@
|
||||
// Tests for user/user_api.cc.
|
||||
|
||||
#include <array>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <filesystem>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
@@ -272,6 +274,30 @@ TEST_F(PluginTest, RecompileCompareObjCache) {
|
||||
mj_deleteVFS(vfs.get());
|
||||
}
|
||||
|
||||
// tiny RGB 2 x 3 PNG file
|
||||
static constexpr uint8_t tex1[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
|
||||
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02,
|
||||
0x08, 0x02, 0x00, 0x00, 0x00, 0x12, 0x16, 0xf1, 0x4d, 0x00, 0x00, 0x00,
|
||||
0x1c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x78, 0xc1, 0xc0, 0xc0,
|
||||
0xc0, 0xf0, 0xbf, 0xb8, 0xb8, 0x98, 0x81, 0xe1, 0x3f, 0xc3, 0xff, 0xff,
|
||||
0xff, 0xc5, 0xc4, 0xc4, 0x00, 0x46, 0xd7, 0x07, 0x7f, 0xd2, 0x52, 0xa1,
|
||||
0x41, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60,
|
||||
0x82
|
||||
};
|
||||
|
||||
// previous PNG file, but rotated by 180 degrees
|
||||
static constexpr uint8_t tex2[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
|
||||
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02,
|
||||
0x08, 0x02, 0x00, 0x00, 0x00, 0x12, 0x16, 0xf1, 0x4d, 0x00, 0x00, 0x00,
|
||||
0x1c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x10, 0x13, 0x13, 0xfb,
|
||||
0xff, 0xff, 0x3f, 0xc3, 0x7f, 0x06, 0x96, 0xd8, 0xd8, 0x58, 0x46, 0x46,
|
||||
0x86, 0x17, 0x0c, 0x0c, 0x00, 0x49, 0x22, 0x06, 0x44, 0xe4, 0x91, 0xb8,
|
||||
0x83, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60,
|
||||
0x82
|
||||
};
|
||||
|
||||
TEST_F(PluginTest, RecompileComparePngCache) {
|
||||
static constexpr char xml[] = R"(
|
||||
<mujoco>
|
||||
@@ -286,31 +312,6 @@ TEST_F(PluginTest, RecompileComparePngCache) {
|
||||
</mujoco>
|
||||
)";
|
||||
|
||||
// tiny RGB 2 x 3 PNG file
|
||||
static constexpr unsigned char tex1[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
|
||||
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02,
|
||||
0x08, 0x02, 0x00, 0x00, 0x00, 0x12, 0x16, 0xf1, 0x4d, 0x00, 0x00, 0x00,
|
||||
0x1c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x78, 0xc1, 0xc0, 0xc0,
|
||||
0xc0, 0xf0, 0xbf, 0xb8, 0xb8, 0x98, 0x81, 0xe1, 0x3f, 0xc3, 0xff, 0xff,
|
||||
0xff, 0xc5, 0xc4, 0xc4, 0x00, 0x46, 0xd7, 0x07, 0x7f, 0xd2, 0x52, 0xa1,
|
||||
0x41, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60,
|
||||
0x82
|
||||
};
|
||||
|
||||
// previous PNG file, but rotated by 180 degrees
|
||||
static constexpr unsigned char tex2[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
|
||||
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02,
|
||||
0x08, 0x02, 0x00, 0x00, 0x00, 0x12, 0x16, 0xf1, 0x4d, 0x00, 0x00, 0x00,
|
||||
0x1c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x10, 0x13, 0x13, 0xfb,
|
||||
0xff, 0xff, 0x3f, 0xc3, 0x7f, 0x06, 0x96, 0xd8, 0xd8, 0x58, 0x46, 0x46,
|
||||
0x86, 0x17, 0x0c, 0x0c, 0x00, 0x49, 0x22, 0x06, 0x44, 0xe4, 0x91, 0xb8,
|
||||
0x83, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60,
|
||||
0x82
|
||||
};
|
||||
|
||||
|
||||
auto vfs = std::make_unique<mjVFS>();
|
||||
mj_defaultVFS(vfs.get());
|
||||
mj_addBufferVFS(vfs.get(), "tex.png", tex1, sizeof(tex1));
|
||||
@@ -334,6 +335,49 @@ TEST_F(PluginTest, RecompileComparePngCache) {
|
||||
mj_deleteVFS(vfs.get());
|
||||
}
|
||||
|
||||
// -------------------------------- test textures ------------------------------
|
||||
|
||||
TEST_F(PluginTest, TextureFromBuffer) {
|
||||
mjSpec* spec = mj_makeSpec();
|
||||
|
||||
mjsTexture* t1 = mjs_addTexture(spec);
|
||||
mjs_setString(t1->name, "tex1");
|
||||
t1->type = mjTEXTURE_2D;
|
||||
t1->width = 3;
|
||||
t1->height = 2;
|
||||
t1->nchannel = 3;
|
||||
mjs_setBuffer(t1->data, (std::byte*)tex1, 18);
|
||||
|
||||
mjsTexture* t2 = mjs_addTexture(spec);
|
||||
mjs_setString(t2->name, "tex2");
|
||||
t2->type = mjTEXTURE_2D;
|
||||
t2->width = 3;
|
||||
t2->height = 2;
|
||||
t2->nchannel = 3;
|
||||
mjs_setBuffer(t2->data, (std::byte*)tex2, 18);
|
||||
|
||||
mjsMaterial* mat = mjs_addMaterial(spec, nullptr);
|
||||
mjs_setString(mat->name, "mat");
|
||||
mjs_setInStringVec(mat->textures, mjTEXROLE_RGB, "tex1");
|
||||
mjs_setInStringVec(mat->textures, mjTEXROLE_ORM, "tex2");
|
||||
|
||||
mjsGeom* geom = mjs_addGeom(mjs_findBody(spec, "world"), nullptr);
|
||||
mjs_setString(geom->material, "mat");
|
||||
geom->size[0] = 1;
|
||||
|
||||
mjModel* m = mj_compile(spec, nullptr);
|
||||
EXPECT_THAT(m, NotNull());
|
||||
EXPECT_EQ(m->ntex, 2);
|
||||
|
||||
std::array<char, 1024> err;
|
||||
std::array<char, 1024> str;
|
||||
mj_saveXMLString(spec, str.data(), str.size(), err.data(), err.size());
|
||||
EXPECT_STREQ(err.data(), "XML Error: no support for buffer textures.");
|
||||
|
||||
mj_deleteModel(m);
|
||||
mj_deleteSpec(spec);
|
||||
}
|
||||
|
||||
// -------------------------------- test attach --------------------------------
|
||||
|
||||
static constexpr char xml_child[] = R"(
|
||||
|
||||
Reference in New Issue
Block a user