Add mjv_copyData

PiperOrigin-RevId: 760642972
Change-Id: I16227fd91bf42618fda684b15b3650758ae29b13
This commit is contained in:
Yuval Tassa
2025-05-19 08:58:45 -07:00
committed by Copybara-Service
parent 670c97c4f7
commit 8268c6d1ff
9 changed files with 236 additions and 113 deletions
+54 -9
View File
@@ -1415,8 +1415,9 @@ mjData* mj_makeData(const mjModel* m) {
// copy mjData, if dest==NULL create new data
mjData* mj_copyData(mjData* dest, const mjModel* m, const mjData* src) {
// copy mjData, if dest==NULL create new data;
// flg_all 1: copy all fields, 0: skip fields not required for visualization
mjData* mj_copyDataVisual(mjData* dest, const mjModel* m, const mjData* src, int flg_all) {
void* save_buffer;
void* save_arena;
@@ -1461,10 +1462,25 @@ mjData* mj_copyData(mjData* dest, const mjModel* m, const mjData* src) {
// copy buffer
{
MJDATA_POINTERS_PREAMBLE(m)
#define X(type, name, nr, nc) \
memcpy((char*)dest->name, (const char*)src->name, sizeof(type)*(m->nr)*nc);
MJDATA_POINTERS
#undef X
if (flg_all) {
#define X(type, name, nr, nc) \
memcpy((char*)dest->name, (const char*)src->name, sizeof(type)*(m->nr)*nc);
MJDATA_POINTERS
#undef X
} else {
// redefine XNV to nothing
#undef XNV
#define XNV(type, name, nr, nc)
#define X(type, name, nr, nc) \
memcpy((char*)dest->name, (const char*)src->name, sizeof(type)*(m->nr)*nc);
MJDATA_POINTERS
#undef X
// redefine XNV to be the same as X
#undef XNV
#define XNV X
}
}
@@ -1474,7 +1490,8 @@ mjData* mj_copyData(mjData* dest, const mjModel* m, const mjData* src) {
#undef MJ_M
#define MJ_M(n) (m->n)
#define X(type, name, nr, nc) \
if (flg_all) {
#define X(type, name, nr, nc) \
if (src->name) { \
dest->name = (type*)((char*)dest->arena + PTRDIFF(src->name, src->arena)); \
ASAN_UNPOISON_MEMORY_REGION(dest->name, sizeof(type) * nr * nc); \
@@ -1482,8 +1499,28 @@ mjData* mj_copyData(mjData* dest, const mjModel* m, const mjData* src) {
} else { \
dest->name = NULL; \
}
MJDATA_ARENA_POINTERS
#undef X
MJDATA_ARENA_POINTERS
#undef X
} else {
// redefine XNV to nothing
#undef XNV
#define XNV(type, name, nr, nc)
#define X(type, name, nr, nc) \
if (src->name) { \
dest->name = (type*)((char*)dest->arena + PTRDIFF(src->name, src->arena)); \
ASAN_UNPOISON_MEMORY_REGION(dest->name, sizeof(type) * nr * nc); \
memcpy((char*)dest->name, (const char*)src->name, sizeof(type) * nr * nc); \
} else { \
dest->name = NULL; \
}
MJDATA_ARENA_POINTERS
#undef X
// redefine XNV to be the same as X
#undef XNV
#define XNV X
}
#undef MJ_M
#define MJ_M(n) n
@@ -1515,6 +1552,14 @@ mjData* mj_copyData(mjData* dest, const mjModel* m, const mjData* src) {
}
mjData* mj_copyData(mjData* dest, const mjModel* m, const mjData* src) {
return mj_copyDataVisual(dest, m, src, /*flg_all=*/1);
}
mjData* mjv_copyData(mjData* dest, const mjModel* m, const mjData* src) {
return mj_copyDataVisual(dest, m, src, /*flg_all=*/0);
}
static void maybe_lock_alloc_mutex(mjData* d) {
if (d->threadpool != 0) {
+3
View File
@@ -99,6 +99,9 @@ MJAPI void mj_makeRawData(mjData** dest, const mjModel* m);
// m is only required to contain the size fields from MJMODEL_INTS.
MJAPI mjData* mj_copyData(mjData* dest, const mjModel* m, const mjData* src);
// copy mjData, skip large arrays not required for abstract visualization
MJAPI mjData* mjv_copyData(mjData* dest, const mjModel* m, const mjData* src);
// set data to defaults
MJAPI void mj_resetData(const mjModel* m, mjData* d);