Store paths for hfields, textures, and skins similar to meshes.

PiperOrigin-RevId: 587283093
Change-Id: Ie6d8d2ecb185697a27d1b6f7fca1312df006af12
This commit is contained in:
Matthew Bennice
2023-12-02 03:50:27 -08:00
committed by Copybara-Service
parent 67fa7c1dc2
commit c0b7b9873d
10 changed files with 166 additions and 67 deletions
+18 -10
View File
@@ -1182,20 +1182,23 @@ struct mjModel_ {
int* skin_bonebodyid; // body id of each bone (nskinbone x 1)
int* skin_bonevertid; // mesh ids of vertices in each bone (nskinbonevert x 1)
float* skin_bonevertweight; // weights of vertices in each bone (nskinbonevert x 1)
int* skin_pathadr; // address of asset path for skin; -1: none (nskin x 1)
// height fields
mjtNum* hfield_size; // (x, y, z_top, z_bottom) (nhfield x 4)
int* hfield_nrow; // number of rows in grid (nhfield x 1)
int* hfield_ncol; // number of columns in grid (nhfield x 1)
int* hfield_adr; // address in hfield_data (nhfield x 1)
float* hfield_data; // elevation data (nhfielddata x 1)
mjtNum* hfield_size; // (x, y, z_top, z_bottom) (nhfield x 4)
int* hfield_nrow; // number of rows in grid (nhfield x 1)
int* hfield_ncol; // number of columns in grid (nhfield x 1)
int* hfield_adr; // address in hfield_data (nhfield x 1)
float* hfield_data; // elevation data (nhfielddata x 1)
int* hfield_pathadr; // address of asset path for hfield; -1: none (nhfield x 1)
// textures
int* tex_type; // texture type (mjtTexture) (ntex x 1)
int* tex_height; // number of rows in texture image (ntex x 1)
int* tex_width; // number of columns in texture image (ntex x 1)
int* tex_adr; // address in rgb (ntex x 1)
mjtByte* tex_rgb; // rgb (alpha = 1) (ntexdata x 1)
int* tex_type; // texture type (mjtTexture) (ntex x 1)
int* tex_height; // number of rows in texture image (ntex x 1)
int* tex_width; // number of columns in texture image (ntex x 1)
int* tex_adr; // address in rgb (ntex x 1)
mjtByte* tex_rgb; // rgb (alpha = 1) (ntexdata x 1)
int* tex_pathadr; // address of asset path for texture; -1: none (ntex x 1)
// materials
int* mat_texid; // texture id; -1: none (nmat x 1)
@@ -2248,6 +2251,8 @@ struct mjvSceneState_ {
mjtNum* flex_radius;
float* flex_rgba;
int* hfield_pathadr;
int* mesh_bvhadr;
int* mesh_bvhnum;
int* mesh_texcoordadr;
@@ -2274,6 +2279,9 @@ struct mjvSceneState_ {
int* skin_bonebodyid;
int* skin_bonevertid;
float* skin_bonevertweight;
int* skin_pathadr;
int* tex_pathadr;
int* mat_texid;
mjtByte* mat_texuniform;
+13 -10
View File
@@ -895,20 +895,23 @@ struct mjModel_ {
int* skin_bonebodyid; // body id of each bone (nskinbone x 1)
int* skin_bonevertid; // mesh ids of vertices in each bone (nskinbonevert x 1)
float* skin_bonevertweight; // weights of vertices in each bone (nskinbonevert x 1)
int* skin_pathadr; // address of asset path for skin; -1: none (nskin x 1)
// height fields
mjtNum* hfield_size; // (x, y, z_top, z_bottom) (nhfield x 4)
int* hfield_nrow; // number of rows in grid (nhfield x 1)
int* hfield_ncol; // number of columns in grid (nhfield x 1)
int* hfield_adr; // address in hfield_data (nhfield x 1)
float* hfield_data; // elevation data (nhfielddata x 1)
mjtNum* hfield_size; // (x, y, z_top, z_bottom) (nhfield x 4)
int* hfield_nrow; // number of rows in grid (nhfield x 1)
int* hfield_ncol; // number of columns in grid (nhfield x 1)
int* hfield_adr; // address in hfield_data (nhfield x 1)
float* hfield_data; // elevation data (nhfielddata x 1)
int* hfield_pathadr; // address of asset path for hfield; -1: none (nhfield x 1)
// textures
int* tex_type; // texture type (mjtTexture) (ntex x 1)
int* tex_height; // number of rows in texture image (ntex x 1)
int* tex_width; // number of columns in texture image (ntex x 1)
int* tex_adr; // address in rgb (ntex x 1)
mjtByte* tex_rgb; // rgb (alpha = 1) (ntexdata x 1)
int* tex_type; // texture type (mjtTexture) (ntex x 1)
int* tex_height; // number of rows in texture image (ntex x 1)
int* tex_width; // number of columns in texture image (ntex x 1)
int* tex_adr; // address in rgb (ntex x 1)
mjtByte* tex_rgb; // rgb (alpha = 1) (ntexdata x 1)
int* tex_pathadr; // address of asset path for texture; -1: none (ntex x 1)
// materials
int* mat_texid; // texture id; -1: none (nmat x 1)
+5
View File
@@ -520,6 +520,8 @@ struct mjvSceneState_ {
mjtNum* flex_radius;
float* flex_rgba;
int* hfield_pathadr;
int* mesh_bvhadr;
int* mesh_bvhnum;
int* mesh_texcoordadr;
@@ -546,6 +548,9 @@ struct mjvSceneState_ {
int* skin_bonebodyid;
int* skin_bonevertid;
float* skin_bonevertweight;
int* skin_pathadr;
int* tex_pathadr;
int* mat_texid;
mjtByte* mat_texuniform;
+3
View File
@@ -395,16 +395,19 @@
XMJV( int, skin_bonebodyid, nskinbone, 1 ) \
XMJV( int, skin_bonevertid, nskinbonevert, 1 ) \
XMJV( float, skin_bonevertweight, nskinbonevert, 1 ) \
XMJV( int, skin_pathadr, nskin, 1 ) \
X ( mjtNum, hfield_size, nhfield, 4 ) \
X ( int, hfield_nrow, nhfield, 1 ) \
X ( int, hfield_ncol, nhfield, 1 ) \
X ( int, hfield_adr, nhfield, 1 ) \
X ( float, hfield_data, nhfielddata, 1 ) \
XMJV( int, hfield_pathadr, nhfield, 1 ) \
X ( int, tex_type, ntex, 1 ) \
X ( int, tex_height, ntex, 1 ) \
X ( int, tex_width, ntex, 1 ) \
X ( int, tex_adr, ntex, 1 ) \
X ( mjtByte, tex_rgb, ntexdata, 1 ) \
XMJV( int, tex_pathadr, ntex, 1 ) \
XMJV( int, mat_texid, nmat, 1 ) \
XMJV( mjtByte, mat_texuniform, nmat, 1 ) \
XMJV( float, mat_texrepeat, nmat, 2 ) \
+52 -10
View File
@@ -2787,75 +2787,96 @@ STRUCTS: Mapping[str, StructDecl] = dict([
),
doc='weights of vertices in each bone (nskinbonevert x 1)', # pylint: disable=line-too-long
),
StructFieldDecl(
name='skin_pathadr',
type=PointerType(
inner_type=ValueType(name='int'),
),
doc='address of asset path for skin; -1: none (nskin x 1)',
),
StructFieldDecl(
name='hfield_size',
type=PointerType(
inner_type=ValueType(name='mjtNum'),
),
doc='(x, y, z_top, z_bottom) (nhfield x 4)',
doc='(x, y, z_top, z_bottom) (nhfield x 4)',
),
StructFieldDecl(
name='hfield_nrow',
type=PointerType(
inner_type=ValueType(name='int'),
),
doc='number of rows in grid (nhfield x 1)',
doc='number of rows in grid (nhfield x 1)',
),
StructFieldDecl(
name='hfield_ncol',
type=PointerType(
inner_type=ValueType(name='int'),
),
doc='number of columns in grid (nhfield x 1)',
doc='number of columns in grid (nhfield x 1)',
),
StructFieldDecl(
name='hfield_adr',
type=PointerType(
inner_type=ValueType(name='int'),
),
doc='address in hfield_data (nhfield x 1)',
doc='address in hfield_data (nhfield x 1)',
),
StructFieldDecl(
name='hfield_data',
type=PointerType(
inner_type=ValueType(name='float'),
),
doc='elevation data (nhfielddata x 1)', # pylint: disable=line-too-long
doc='elevation data (nhfielddata x 1)', # pylint: disable=line-too-long
),
StructFieldDecl(
name='hfield_pathadr',
type=PointerType(
inner_type=ValueType(name='int'),
),
doc='address of asset path for hfield; -1: none (nhfield x 1)',
),
StructFieldDecl(
name='tex_type',
type=PointerType(
inner_type=ValueType(name='int'),
),
doc='texture type (mjtTexture) (ntex x 1)',
doc='texture type (mjtTexture) (ntex x 1)',
),
StructFieldDecl(
name='tex_height',
type=PointerType(
inner_type=ValueType(name='int'),
),
doc='number of rows in texture image (ntex x 1)',
doc='number of rows in texture image (ntex x 1)',
),
StructFieldDecl(
name='tex_width',
type=PointerType(
inner_type=ValueType(name='int'),
),
doc='number of columns in texture image (ntex x 1)',
doc='number of columns in texture image (ntex x 1)',
),
StructFieldDecl(
name='tex_adr',
type=PointerType(
inner_type=ValueType(name='int'),
),
doc='address in rgb (ntex x 1)',
doc='address in rgb (ntex x 1)',
),
StructFieldDecl(
name='tex_rgb',
type=PointerType(
inner_type=ValueType(name='mjtByte'),
),
doc='rgb (alpha = 1) (ntexdata x 1)',
doc='rgb (alpha = 1) (ntexdata x 1)', # pylint: disable=line-too-long
),
StructFieldDecl(
name='tex_pathadr',
type=PointerType(
inner_type=ValueType(name='int'),
),
doc='address of asset path for texture; -1: none (ntex x 1)',
),
StructFieldDecl(
name='mat_texid',
@@ -6825,6 +6846,13 @@ STRUCTS: Mapping[str, StructDecl] = dict([
),
doc='',
),
StructFieldDecl(
name='hfield_pathadr',
type=PointerType(
inner_type=ValueType(name='int'),
),
doc='',
),
StructFieldDecl(
name='mesh_bvhadr',
type=PointerType(
@@ -7000,6 +7028,20 @@ STRUCTS: Mapping[str, StructDecl] = dict([
),
doc='',
),
StructFieldDecl(
name='skin_pathadr',
type=PointerType(
inner_type=ValueType(name='int'),
),
doc='',
),
StructFieldDecl(
name='tex_pathadr',
type=PointerType(
inner_type=ValueType(name='int'),
),
doc='',
),
StructFieldDecl(
name='mat_texid',
type=PointerType(
+4 -1
View File
@@ -1957,7 +1957,10 @@ const char* mj_validateReferences(const mjModel* m) {
X(name_textadr, ntext, nnames , 0 ) \
X(name_tupleadr, ntuple, nnames , 0 ) \
X(name_keyadr, nkey, nnames , 0 ) \
X(mesh_pathadr, nmesh, npaths , 0 )
X(hfield_pathadr, nhfield, npaths , 0 ) \
X(mesh_pathadr, nmesh, npaths , 0 ) \
X(skin_pathadr, nskin, npaths , 0 ) \
X(tex_pathadr, ntex, npaths , 0 )
#define X(adrarray, nadrs, ntarget, numarray) { \
int *nums = (numarray); \
+57 -36
View File
@@ -906,6 +906,18 @@ void mjCModel::SetDefaultNames(void) {
const int nPOS[4] = {7, 4, 1, 1};
const int nVEL[4] = {6, 3, 1, 1};
template <typename T>
static size_t getpathslength(std::vector<T> list) {
size_t result = 0;
for (const auto& element : list) {
if (!element->get_file().empty()) {
result += element->get_file().length() + 1;
}
}
return result;
}
// set array sizes
void mjCModel::SetSizes(void) {
// set from object list sizes
@@ -1038,18 +1050,16 @@ void mjCModel::SetSizes(void) {
// npaths
npaths = 0;
for (int i=0; i<nmesh; i++) {
if (meshes[i]->file().empty()) {
continue;
}
npaths += (int)meshes[i]->file().length() + 1;
}
npaths += getpathslength(hfields);
npaths += getpathslength(meshes);
npaths += getpathslength(skins);
npaths += getpathslength(textures);
if (npaths == 0) {
npaths = 1;
}
// nemax
for (int i=0; i<neq; i++)
for (int i=0; i<neq; i++) {
if (equalities[i]->type==mjEQ_CONNECT) {
nemax += 3;
} else if (equalities[i]->type==mjEQ_WELD) {
@@ -1057,6 +1067,7 @@ void mjCModel::SetSizes(void) {
} else {
nemax += 1;
}
}
}
@@ -1243,6 +1254,25 @@ void mjCModel::LengthRange(mjModel* m, mjData* data) {
}
// Add items to a generic list. This enables the names and paths to be stored.
// input - string to add
// adr - current address in the list
// output_adr_field - the field where the address should be stored (name_meshadr)
// output_buffer - the field where the data should be stored (i.e. names or paths)
static int addtolist(const std::string& input, int adr, int* output_adr_field, char* output_buffer) {
*output_adr_field = adr;
// copy input
memcpy(output_buffer+adr, input.c_str(), input.size());
adr += (int)input.size();
// append 0
output_buffer[adr] = 0;
adr++;
return adr;
}
// process names from one list: concatenate, compute addresses
template <class T>
static int namelist(vector<T*>& list, int adr, int* name_adr, char* names, int* map) {
@@ -1262,15 +1292,7 @@ static int namelist(vector<T*>& list, int adr, int* name_adr, char* names, int*
}
for (unsigned int i=0; i<list.size(); i++) {
name_adr[i] = adr;
// copy name
memcpy(names+adr, list[i]->name.c_str(), list[i]->name.size());
adr += (int)list[i]->name.size();
// append 0
names[adr] = 0;
adr++;
adr = addtolist(list[i]->name, adr, &name_adr[i], names);
}
return adr;
@@ -1360,28 +1382,28 @@ void mjCModel::CopyNames(mjModel* m) {
}
}
void mjCModel::CopyPaths(mjModel* m) {
// start with 0 address.
size_t adr = 0;
m->paths[0] = 0;
for (unsigned int i=0; i<meshes.size(); i++) {
if (meshes[i]->file().empty()) {
m->mesh_pathadr[i] = -1;
// process paths from one list: concatenate, compute addresses
template <class T>
static int pathlist(vector<T*>& list, int adr, int* path_adr, char* paths) {
for (unsigned int i = 0; i < list.size(); ++i) {
path_adr[i] = -1;
if (!list[i] || list[i]->get_file().empty()) {
continue;
}
m->mesh_pathadr[i] = adr;
// copy path
size_t path_size = meshes[i]->file().size();
memcpy(m->paths+adr, meshes[i]->file().c_str(), path_size);
adr += path_size;
// append 0
m->paths[adr] = 0;
adr++;
adr = addtolist(list[i]->get_file(), adr, &path_adr[i], paths);
}
return adr;
}
void mjCModel::CopyPaths(mjModel* m) {
// start with 0 address, unlike m->names m->paths might be empty
size_t adr = 0;
m->paths[0] = 0;
adr = pathlist(hfields, adr, m->hfield_pathadr, m->paths);
adr = pathlist(meshes, adr, m->mesh_pathadr, m->paths);
adr = pathlist(skins, adr, m->skin_pathadr, m->paths);
adr = pathlist(textures, adr, m->tex_pathadr, m->paths);
}
@@ -2891,7 +2913,6 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) {
// resolve asset references, compute sizes
IndexAssets();
SetSizes();
// fuse static if enabled
if (fusestatic) {
FuseStatic();
+7
View File
@@ -615,6 +615,7 @@ class mjCMesh: public mjCBase {
// public getters
const std::string& content_type() const { return content_type_; }
const std::string& file() const { return file_; }
const std::string& get_file() const { return file_; }
const double* refpos() const { return refpos_; }
const double* refquat() const { return refquat_; }
const double* scale() const { return scale_; }
@@ -766,6 +767,8 @@ class mjCSkin: public mjCBase {
friend class mjXWriter;
public:
std::string get_file() const { return file; }
std::string file; // skin file
std::string material; // name of material used for rendering
float rgba[4]; // rgba when material is omitted
@@ -804,6 +807,8 @@ class mjCHField : public mjCBase {
friend class mjXWriter;
public:
std::string get_file() const { return file; }
std::string content_type; // content type of file
std::string file; // file: (nrow, ncol, [elevation data])
double size[4]; // hfield size (ignore referencing geom size)
@@ -831,6 +836,8 @@ class mjCTexture : public mjCBase {
friend class mjXWriter;
public:
std::string get_file() const { return file; }
mjtTexture type; // texture type
// method 1: builtin
+1
View File
@@ -18,6 +18,7 @@
-1.618 0 1
-1.618 0 -1"/>
<hfield name="hfield" nrow="3" ncol="3" size=".2 .2 .1 .03"/>
<texture builtin="gradient" height="100" rgb1="1 1 1" rgb2="0 0 0" type="skybox" width="100"/>
</asset>
<default>
+6
View File
@@ -5393,16 +5393,19 @@ public unsafe struct mjModel_ {
public int* skin_bonebodyid;
public int* skin_bonevertid;
public float* skin_bonevertweight;
public int* skin_pathadr;
public double* hfield_size;
public int* hfield_nrow;
public int* hfield_ncol;
public int* hfield_adr;
public float* hfield_data;
public int* hfield_pathadr;
public int* tex_type;
public int* tex_height;
public int* tex_width;
public int* tex_adr;
public byte* tex_rgb;
public int* tex_pathadr;
public int* mat_texid;
public byte* mat_texuniform;
public float* mat_texrepeat;
@@ -6164,6 +6167,7 @@ public unsafe struct model {
public int* flex_bvhnum;
public double* flex_radius;
public float* flex_rgba;
public int* hfield_pathadr;
public int* mesh_bvhadr;
public int* mesh_bvhnum;
public int* mesh_texcoordadr;
@@ -6189,6 +6193,8 @@ public unsafe struct model {
public int* skin_bonebodyid;
public int* skin_bonevertid;
public float* skin_bonevertweight;
public int* skin_pathadr;
public int* tex_pathadr;
public int* mat_texid;
public byte* mat_texuniform;
public float* mat_texrepeat;