12 #include <box2d/b2_fixture.h>
13 #include <box2d/b2_friction_joint.h>
14 #include <box2d/b2_polygon_shape.h>
15 #include <box2d/b2_world.h>
16 #include <mrpt/img/TColor.h>
17 #include <mrpt/math/TPolygon2D.h>
18 #include <mrpt/opengl/CSetOfLines.h>
19 #include <mrpt/opengl/CSetOfObjects.h>
20 #include <mrpt/poses/CPose2D.h>
21 #include <mrpt/typemeta/TEnumType.h>
22 #include <mvsim/ClassFactory.h>
23 #include <mvsim/Sensors/SensorBase.h>
24 #include <mvsim/Simulable.h>
25 #include <mvsim/TParameterDefinitions.h>
26 #include <mvsim/VisualObject.h>
27 #include <mvsim/basic_types.h>
53 using Ptr = std::shared_ptr<Block>;
69 const mrpt::math::TVector2D& force,
70 const mrpt::math::TPoint2D& applyPoint = mrpt::math::TPoint2D(0, 0))
override;
81 virtual double getMass()
const {
return mass_; }
82 b2Body* getBox2DBlockBody() {
return b2dBody_; }
90 const mrpt::math::TPolygon2D&
blockShape()
const {
return block_poly_; }
92 void blockShape(
const mrpt::math::TPolygon2D& p)
95 updateMaxRadiusFromPoly();
109 double mass()
const {
return mass_; }
110 void mass(
double newValue) { mass_ = newValue; }
112 bool isStatic()
const;
113 void setIsStatic(
bool b);
115 const mrpt::img::TColor block_color()
const {
return block_color_; }
116 void block_color(
const mrpt::img::TColor& c)
122 double block_z_min()
const {
return block_z_min_; }
123 double block_z_max()
const {
return block_z_max_; }
124 void block_z_min(
double v)
129 void block_z_max(
double v)
136 void visual_scale(
double v)
146 VisualObject* meAsVisualObject()
override {
return this; }
148 std::optional<float> getElevationAt(
const mrpt::math::TPoint2D& worldXY)
const override;
151 virtual void internalGuiUpdate(
152 const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
153 const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical,
bool childrenOnly)
override;
159 std::vector<b2FrictionJoint*> friction_joints_;
163 bool isStatic_ =
false;
164 mrpt::math::TPolygon2D block_poly_;
170 double block_z_min_ = std::numeric_limits<double>::quiet_NaN(),
171 block_z_max_ = std::numeric_limits<double>::quiet_NaN();
173 mrpt::img::TColor block_color_{0x00, 0x00, 0xff};
194 const TParameterDefinitions params_ = {
195 {
"mass", {
"%lf", &mass_}},
196 {
"zmin", {
"%lf", &block_z_min_}},
197 {
"zmax", {
"%lf", &block_z_max_}},
201 {
"color", {
"%color", &block_color_}},
203 {
"static", {
"%bool", &isStatic_}},
210 void updateMaxRadiusFromPoly();
213 b2Fixture* fixture_block_;
216 void internal_internalGuiUpdate_forces(mrpt::opengl::COpenGLScene& scene);
221 struct GeometryParams
223 GeometryParams() =
default;
229 float length = 0, lx = 0, ly = 0, lz = 0;
230 int vertex_count = 0;
232 const TParameterDefinitions params = {
233 {
"type", {
"%s", &typeStr}},
234 {
"radius", {
"%f", &radius}},
235 {
"length", {
"%f", &length}},
239 {
"vertex_count", {
"%i", &vertex_count}},
243 GeometryParams geomParams_;
245 mrpt::opengl::CSetOfObjects::Ptr gl_block_;
246 mrpt::opengl::CSetOfLines::Ptr gl_forces_;
247 std::mutex force_segments_for_rendering_cs_;
248 std::vector<mrpt::math::TSegment3D> force_segments_for_rendering_;
259 using Ptr = std::shared_ptr<DummyInvisibleBlock>;
273 for (
auto& s : sensors_)
275 s->simul_pre_timestep(context);
281 for (
auto& s : sensors_)
283 s->simul_post_timestep(context);
287 virtual void apply_force(
288 [[maybe_unused]]
const mrpt::math::TVector2D& force,
289 [[maybe_unused]]
const mrpt::math::TPoint2D& applyPoint)
override
293 virtual void create_multibody_system(b2World&) {}
295 virtual double getMaxBlockRadius()
const {
return 0; }
300 void add_sensor(
const SensorBase::Ptr& sensor) { sensors_.push_back(sensor); }
303 void internalGuiUpdate(
304 const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
305 const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical,
306 [[maybe_unused]]
bool childrenOnly)
override;
311 Simulable::registerOnServer(c);
312 for (
auto& sensor : sensors_)
314 sensor->registerOnServer(c);
319 TListSensors sensors_;
327 MRPT_FILL_ENUM_CUSTOM_NAME(GeometryType::Cylinder,
"cylinder");
328 MRPT_FILL_ENUM_CUSTOM_NAME(GeometryType::Sphere,
"sphere");
329 MRPT_FILL_ENUM_CUSTOM_NAME(GeometryType::Box,
"box");
330 MRPT_FILL_ENUM_CUSTOM_NAME(GeometryType::Ramp,
"ramp");
331 MRPT_FILL_ENUM_CUSTOM_NAME(GeometryType::SemiCylinderBump,
"semi_cylinder_bump");
double lateral_friction_
Default: 0.5.
Definition: Block.h:176
void setBlockIndex(size_t idx)
Definition: Block.h:100
virtual void simul_post_timestep(const TSimulContext &context) override
double restitution_
Default: 0.01.
Definition: Block.h:178
static void register_block_class(const World &parent, const rapidxml::xml_node< char > *xml_node)
size_t blockIndex_
Definition: Block.h:157
double visual_scale_
Definition: Block.h:192
virtual void simul_pre_timestep(const TSimulContext &context) override
double maxRadius_
Definition: Block.h:168
float linear_damping_
Definition: Block.h:181
size_t getBlockIndex() const
Definition: Block.h:102
static Ptr factory(World *parent, const std::string &xml_text)
This is an overloaded member function, provided for convenience. It differs from the above function o...
bool default_block_z_min_max() const
virtual void apply_force(const mrpt::math::TVector2D &force, const mrpt::math::TPoint2D &applyPoint=mrpt::math::TPoint2D(0, 0)) override
double groundFriction_
Default: 0.5.
Definition: Block.h:177
bool intangible_
Definition: Block.h:188
static Ptr factory(World *parent, const rapidxml::xml_node< char > *xml_node)
mrpt::math::TPoint2D getBlockCenterOfMass() const
In local coordinates.
Definition: Block.h:83
virtual double getMass() const
Definition: Block.h:81
mrpt::math::TPoint2D block_com_
In local coordinates.
Definition: Block.h:174
virtual void create_multibody_system(b2World &world)
float angular_damping_
Definition: Block.h:184
const mrpt::math::TPolygon2D & blockShape() const
Definition: Block.h:90
virtual double getMaxBlockRadius() const
Definition: Block.h:78
static Ptr factory(World *parent, const rapidxml::xml_node< char > *xml_node)
virtual double getMass() const
Definition: Block.h:298
static Ptr factory(World *parent, const std::string &xml_text)
This is an overloaded member function, provided for convenience. It differs from the above function o...
virtual void simul_post_timestep(const TSimulContext &context) override
Definition: Block.h:278
virtual void simul_pre_timestep(const TSimulContext &context) override
Definition: Block.h:270
Definition: Simulable.h:40
virtual void simul_pre_timestep(const TSimulContext &context)
virtual void simul_post_timestep(const TSimulContext &context)
Definition: VisualObject.h:36
GeometryType
Definition: Block.h:37
Definition: basic_types.h:58