Refactor array initialization for mjData and mjvScene in MuJoCo WASM bindings.
PiperOrigin-RevId: 829406147 Change-Id: Ib93c49e938086fb277e4959ade1f25e6ced5c70d
This commit is contained in:
committed by
Copybara-Service
parent
8734cab366
commit
6fb4394701
@@ -5698,9 +5698,6 @@ struct MjData {
|
|||||||
MjData(MjModel *m);
|
MjData(MjModel *m);
|
||||||
explicit MjData(const MjModel &, const MjData &);
|
explicit MjData(const MjModel &, const MjData &);
|
||||||
~MjData();
|
~MjData();
|
||||||
std::vector<MjSolverStat> InitSolverArray();
|
|
||||||
std::vector<MjTimerStat> InitTimerArray();
|
|
||||||
std::vector<MjWarningStat> InitWarningArray();
|
|
||||||
std::vector<MjContact> contact() const;
|
std::vector<MjContact> contact() const;
|
||||||
std::unique_ptr<MjData> copy();
|
std::unique_ptr<MjData> copy();
|
||||||
mjData* get() const;
|
mjData* get() const;
|
||||||
@@ -6381,8 +6378,6 @@ struct MjvScene {
|
|||||||
~MjvScene();
|
~MjvScene();
|
||||||
std::unique_ptr<MjvScene> copy();
|
std::unique_ptr<MjvScene> copy();
|
||||||
int GetSumFlexFaces() const;
|
int GetSumFlexFaces() const;
|
||||||
std::vector<MjvLight> InitLightsArray();
|
|
||||||
std::vector<MjvGLCamera> InitCameraArray();
|
|
||||||
|
|
||||||
mjvScene* get() const;
|
mjvScene* get() const;
|
||||||
void set(mjvScene* ptr);
|
void set(mjvScene* ptr);
|
||||||
@@ -8362,6 +8357,15 @@ void MjsDefault::set(mjsDefault* ptr) {
|
|||||||
ptr_ = ptr;
|
ptr_ = ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename WrapperType, typename ArrayType, typename SizeType>
|
||||||
|
std::vector<WrapperType> InitWrapperArray(ArrayType* array, SizeType size) {
|
||||||
|
std::vector<WrapperType> result;
|
||||||
|
result.reserve(size);
|
||||||
|
for (int i = 0; i < size; ++i) {
|
||||||
|
result.emplace_back(&array[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
// =============== MjModel =============== //
|
// =============== MjModel =============== //
|
||||||
MjModel::MjModel(mjModel *m)
|
MjModel::MjModel(mjModel *m)
|
||||||
@@ -8385,17 +8389,17 @@ MjData::MjData(MjModel *m) {
|
|||||||
model = m->get();
|
model = m->get();
|
||||||
ptr_ = mj_makeData(model);
|
ptr_ = mj_makeData(model);
|
||||||
if (ptr_) {
|
if (ptr_) {
|
||||||
solver = InitSolverArray();
|
solver = InitWrapperArray<MjSolverStat>(get()->solver, mjNSOLVER * mjNISLAND);
|
||||||
timer = InitTimerArray();
|
timer = InitWrapperArray<MjTimerStat>(get()->timer, mjNTIMER);
|
||||||
warning = InitWarningArray();
|
warning = InitWrapperArray<MjWarningStat>(get()->warning, mjNWARNING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MjData::MjData(const MjModel &model, const MjData &other)
|
MjData::MjData(const MjModel &model, const MjData &other)
|
||||||
: ptr_(mj_copyData(nullptr, model.get(), other.get())), model(model.get()) {
|
: ptr_(mj_copyData(nullptr, model.get(), other.get())), model(model.get()) {
|
||||||
if (ptr_) {
|
if (ptr_) {
|
||||||
solver = InitSolverArray();
|
solver = InitWrapperArray<MjSolverStat>(get()->solver, mjNSOLVER * mjNISLAND);
|
||||||
timer = InitTimerArray();
|
timer = InitWrapperArray<MjTimerStat>(get()->timer, mjNTIMER);
|
||||||
warning = InitWarningArray();
|
warning = InitWrapperArray<MjWarningStat>(get()->warning, mjNWARNING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MjData::~MjData() {
|
MjData::~MjData() {
|
||||||
@@ -8406,38 +8410,8 @@ MjData::~MjData() {
|
|||||||
mjData* MjData::get() const { return ptr_; }
|
mjData* MjData::get() const { return ptr_; }
|
||||||
void MjData::set(mjData *ptr) { ptr_ = ptr; }
|
void MjData::set(mjData *ptr) { ptr_ = ptr; }
|
||||||
|
|
||||||
std::vector<MjSolverStat> MjData::InitSolverArray() {
|
|
||||||
std::vector<MjSolverStat> arr;
|
|
||||||
arr.reserve(mjNSOLVER * mjNISLAND);
|
|
||||||
for (int i = 0; i < mjNSOLVER * mjNISLAND; i++) {
|
|
||||||
arr.emplace_back(&get()->solver[i]);
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
std::vector<MjTimerStat> MjData::InitTimerArray() {
|
|
||||||
std::vector<MjTimerStat> arr;
|
|
||||||
arr.reserve(mjNTIMER);
|
|
||||||
for (int i = 0; i < mjNTIMER; i++) {
|
|
||||||
arr.emplace_back(&get()->timer[i]);
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
std::vector<MjWarningStat>
|
|
||||||
MjData::InitWarningArray() {
|
|
||||||
std::vector<MjWarningStat> arr;
|
|
||||||
arr.reserve(mjNWARNING);
|
|
||||||
for (int i = 0; i < mjNWARNING; i++) {
|
|
||||||
arr.emplace_back(&get()->warning[i]);
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
std::vector<MjContact> MjData::contact() const {
|
std::vector<MjContact> MjData::contact() const {
|
||||||
std::vector<MjContact> contacts;
|
return InitWrapperArray<MjContact>(get()->contact, get()->ncon);
|
||||||
contacts.reserve(get()->ncon);
|
|
||||||
for (int i = 0; i < get()->ncon; ++i) {
|
|
||||||
contacts.emplace_back(&get()->contact[i]);
|
|
||||||
}
|
|
||||||
return contacts;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MjvScene::MjvScene() {
|
MjvScene::MjvScene() {
|
||||||
@@ -8445,8 +8419,8 @@ MjvScene::MjvScene() {
|
|||||||
ptr_ = new mjvScene;
|
ptr_ = new mjvScene;
|
||||||
mjv_defaultScene(ptr_);
|
mjv_defaultScene(ptr_);
|
||||||
mjv_makeScene(nullptr, ptr_, 0);
|
mjv_makeScene(nullptr, ptr_, 0);
|
||||||
lights = InitLightsArray();
|
lights = InitWrapperArray<MjvLight>(ptr_->lights, mjMAXLIGHT);
|
||||||
camera = InitCameraArray();
|
camera = InitWrapperArray<MjvGLCamera>(ptr_->camera, 2);
|
||||||
};
|
};
|
||||||
|
|
||||||
MjvScene::MjvScene(MjModel *m, int maxgeom) {
|
MjvScene::MjvScene(MjModel *m, int maxgeom) {
|
||||||
@@ -8455,8 +8429,8 @@ MjvScene::MjvScene(MjModel *m, int maxgeom) {
|
|||||||
ptr_ = new mjvScene;
|
ptr_ = new mjvScene;
|
||||||
mjv_defaultScene(ptr_);
|
mjv_defaultScene(ptr_);
|
||||||
mjv_makeScene(model, ptr_, maxgeom);
|
mjv_makeScene(model, ptr_, maxgeom);
|
||||||
lights = InitLightsArray();
|
lights = InitWrapperArray<MjvLight>(ptr_->lights, mjMAXLIGHT);
|
||||||
camera = InitCameraArray();
|
camera = InitWrapperArray<MjvGLCamera>(ptr_->camera, 2);
|
||||||
};
|
};
|
||||||
MjvScene::~MjvScene() {
|
MjvScene::~MjvScene() {
|
||||||
if (owned_ && ptr_) {
|
if (owned_ && ptr_) {
|
||||||
@@ -8502,31 +8476,8 @@ int MjvScene::GetSumFlexFaces() const {
|
|||||||
return nflexface;
|
return nflexface;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<MjvLight> MjvScene::InitLightsArray() {
|
|
||||||
std::vector<MjvLight> arr;
|
|
||||||
arr.reserve(mjMAXLIGHT);
|
|
||||||
for (int i = 0; i < mjMAXLIGHT; i++) {
|
|
||||||
arr.emplace_back(&ptr_->lights[i]);
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<MjvGLCamera> MjvScene::InitCameraArray() {
|
|
||||||
std::vector<MjvGLCamera> arr;
|
|
||||||
arr.reserve(2);
|
|
||||||
for (int i = 0; i < 2; i++) {
|
|
||||||
arr.emplace_back(&ptr_->camera[i]);
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<MjvGeom> MjvScene::geoms() const {
|
std::vector<MjvGeom> MjvScene::geoms() const {
|
||||||
std::vector<MjvGeom> geoms;
|
return InitWrapperArray<MjvGeom>(ptr_->geoms, ptr_->ngeom);
|
||||||
geoms.reserve(ptr_->ngeom);
|
|
||||||
for (int i = 0; i < ptr_->ngeom; ++i) {
|
|
||||||
geoms.emplace_back(&ptr_->geoms[i]);
|
|
||||||
}
|
|
||||||
return geoms;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MjSpec::MjSpec()
|
MjSpec::MjSpec()
|
||||||
|
|||||||
@@ -94,9 +94,6 @@ struct MjData {
|
|||||||
MjData(MjModel *m);
|
MjData(MjModel *m);
|
||||||
explicit MjData(const MjModel &, const MjData &);
|
explicit MjData(const MjModel &, const MjData &);
|
||||||
~MjData();
|
~MjData();
|
||||||
std::vector<MjSolverStat> InitSolverArray();
|
|
||||||
std::vector<MjTimerStat> InitTimerArray();
|
|
||||||
std::vector<MjWarningStat> InitWarningArray();
|
|
||||||
std::vector<MjContact> contact() const;
|
std::vector<MjContact> contact() const;
|
||||||
std::unique_ptr<MjData> copy();
|
std::unique_ptr<MjData> copy();
|
||||||
mjData* get() const;
|
mjData* get() const;
|
||||||
@@ -120,8 +117,6 @@ struct MjvScene {
|
|||||||
~MjvScene();
|
~MjvScene();
|
||||||
std::unique_ptr<MjvScene> copy();
|
std::unique_ptr<MjvScene> copy();
|
||||||
int GetSumFlexFaces() const;
|
int GetSumFlexFaces() const;
|
||||||
std::vector<MjvLight> InitLightsArray();
|
|
||||||
std::vector<MjvGLCamera> InitCameraArray();
|
|
||||||
|
|
||||||
mjvScene* get() const;
|
mjvScene* get() const;
|
||||||
void set(mjvScene* ptr);
|
void set(mjvScene* ptr);
|
||||||
@@ -352,6 +347,15 @@ EMSCRIPTEN_BINDINGS(mujoco_enums) {
|
|||||||
|
|
||||||
// STRUCTS
|
// STRUCTS
|
||||||
// {{ AUTOGENNED_STRUCTS_SOURCE }}
|
// {{ AUTOGENNED_STRUCTS_SOURCE }}
|
||||||
|
template <typename WrapperType, typename ArrayType, typename SizeType>
|
||||||
|
std::vector<WrapperType> InitWrapperArray(ArrayType* array, SizeType size) {
|
||||||
|
std::vector<WrapperType> result;
|
||||||
|
result.reserve(size);
|
||||||
|
for (int i = 0; i < size; ++i) {
|
||||||
|
result.emplace_back(&array[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
// =============== MjModel =============== //
|
// =============== MjModel =============== //
|
||||||
MjModel::MjModel(mjModel *m)
|
MjModel::MjModel(mjModel *m)
|
||||||
@@ -375,17 +379,17 @@ MjData::MjData(MjModel *m) {
|
|||||||
model = m->get();
|
model = m->get();
|
||||||
ptr_ = mj_makeData(model);
|
ptr_ = mj_makeData(model);
|
||||||
if (ptr_) {
|
if (ptr_) {
|
||||||
solver = InitSolverArray();
|
solver = InitWrapperArray<MjSolverStat>(get()->solver, mjNSOLVER * mjNISLAND);
|
||||||
timer = InitTimerArray();
|
timer = InitWrapperArray<MjTimerStat>(get()->timer, mjNTIMER);
|
||||||
warning = InitWarningArray();
|
warning = InitWrapperArray<MjWarningStat>(get()->warning, mjNWARNING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MjData::MjData(const MjModel &model, const MjData &other)
|
MjData::MjData(const MjModel &model, const MjData &other)
|
||||||
: ptr_(mj_copyData(nullptr, model.get(), other.get())), model(model.get()) {
|
: ptr_(mj_copyData(nullptr, model.get(), other.get())), model(model.get()) {
|
||||||
if (ptr_) {
|
if (ptr_) {
|
||||||
solver = InitSolverArray();
|
solver = InitWrapperArray<MjSolverStat>(get()->solver, mjNSOLVER * mjNISLAND);
|
||||||
timer = InitTimerArray();
|
timer = InitWrapperArray<MjTimerStat>(get()->timer, mjNTIMER);
|
||||||
warning = InitWarningArray();
|
warning = InitWrapperArray<MjWarningStat>(get()->warning, mjNWARNING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MjData::~MjData() {
|
MjData::~MjData() {
|
||||||
@@ -396,38 +400,8 @@ MjData::~MjData() {
|
|||||||
mjData* MjData::get() const { return ptr_; }
|
mjData* MjData::get() const { return ptr_; }
|
||||||
void MjData::set(mjData *ptr) { ptr_ = ptr; }
|
void MjData::set(mjData *ptr) { ptr_ = ptr; }
|
||||||
|
|
||||||
std::vector<MjSolverStat> MjData::InitSolverArray() {
|
|
||||||
std::vector<MjSolverStat> arr;
|
|
||||||
arr.reserve(mjNSOLVER * mjNISLAND);
|
|
||||||
for (int i = 0; i < mjNSOLVER * mjNISLAND; i++) {
|
|
||||||
arr.emplace_back(&get()->solver[i]);
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
std::vector<MjTimerStat> MjData::InitTimerArray() {
|
|
||||||
std::vector<MjTimerStat> arr;
|
|
||||||
arr.reserve(mjNTIMER);
|
|
||||||
for (int i = 0; i < mjNTIMER; i++) {
|
|
||||||
arr.emplace_back(&get()->timer[i]);
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
std::vector<MjWarningStat>
|
|
||||||
MjData::InitWarningArray() {
|
|
||||||
std::vector<MjWarningStat> arr;
|
|
||||||
arr.reserve(mjNWARNING);
|
|
||||||
for (int i = 0; i < mjNWARNING; i++) {
|
|
||||||
arr.emplace_back(&get()->warning[i]);
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
std::vector<MjContact> MjData::contact() const {
|
std::vector<MjContact> MjData::contact() const {
|
||||||
std::vector<MjContact> contacts;
|
return InitWrapperArray<MjContact>(get()->contact, get()->ncon);
|
||||||
contacts.reserve(get()->ncon);
|
|
||||||
for (int i = 0; i < get()->ncon; ++i) {
|
|
||||||
contacts.emplace_back(&get()->contact[i]);
|
|
||||||
}
|
|
||||||
return contacts;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MjvScene::MjvScene() {
|
MjvScene::MjvScene() {
|
||||||
@@ -435,8 +409,8 @@ MjvScene::MjvScene() {
|
|||||||
ptr_ = new mjvScene;
|
ptr_ = new mjvScene;
|
||||||
mjv_defaultScene(ptr_);
|
mjv_defaultScene(ptr_);
|
||||||
mjv_makeScene(nullptr, ptr_, 0);
|
mjv_makeScene(nullptr, ptr_, 0);
|
||||||
lights = InitLightsArray();
|
lights = InitWrapperArray<MjvLight>(ptr_->lights, mjMAXLIGHT);
|
||||||
camera = InitCameraArray();
|
camera = InitWrapperArray<MjvGLCamera>(ptr_->camera, 2);
|
||||||
};
|
};
|
||||||
|
|
||||||
MjvScene::MjvScene(MjModel *m, int maxgeom) {
|
MjvScene::MjvScene(MjModel *m, int maxgeom) {
|
||||||
@@ -445,8 +419,8 @@ MjvScene::MjvScene(MjModel *m, int maxgeom) {
|
|||||||
ptr_ = new mjvScene;
|
ptr_ = new mjvScene;
|
||||||
mjv_defaultScene(ptr_);
|
mjv_defaultScene(ptr_);
|
||||||
mjv_makeScene(model, ptr_, maxgeom);
|
mjv_makeScene(model, ptr_, maxgeom);
|
||||||
lights = InitLightsArray();
|
lights = InitWrapperArray<MjvLight>(ptr_->lights, mjMAXLIGHT);
|
||||||
camera = InitCameraArray();
|
camera = InitWrapperArray<MjvGLCamera>(ptr_->camera, 2);
|
||||||
};
|
};
|
||||||
MjvScene::~MjvScene() {
|
MjvScene::~MjvScene() {
|
||||||
if (owned_ && ptr_) {
|
if (owned_ && ptr_) {
|
||||||
@@ -492,31 +466,8 @@ int MjvScene::GetSumFlexFaces() const {
|
|||||||
return nflexface;
|
return nflexface;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<MjvLight> MjvScene::InitLightsArray() {
|
|
||||||
std::vector<MjvLight> arr;
|
|
||||||
arr.reserve(mjMAXLIGHT);
|
|
||||||
for (int i = 0; i < mjMAXLIGHT; i++) {
|
|
||||||
arr.emplace_back(&ptr_->lights[i]);
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<MjvGLCamera> MjvScene::InitCameraArray() {
|
|
||||||
std::vector<MjvGLCamera> arr;
|
|
||||||
arr.reserve(2);
|
|
||||||
for (int i = 0; i < 2; i++) {
|
|
||||||
arr.emplace_back(&ptr_->camera[i]);
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<MjvGeom> MjvScene::geoms() const {
|
std::vector<MjvGeom> MjvScene::geoms() const {
|
||||||
std::vector<MjvGeom> geoms;
|
return InitWrapperArray<MjvGeom>(ptr_->geoms, ptr_->ngeom);
|
||||||
geoms.reserve(ptr_->ngeom);
|
|
||||||
for (int i = 0; i < ptr_->ngeom; ++i) {
|
|
||||||
geoms.emplace_back(&ptr_->geoms[i]);
|
|
||||||
}
|
|
||||||
return geoms;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MjSpec::MjSpec()
|
MjSpec::MjSpec()
|
||||||
|
|||||||
Reference in New Issue
Block a user