Pogosim
Loading...
Searching...
No Matches
objects.h
Go to the documentation of this file.
1#ifndef OBJECTS_H
2#define OBJECTS_H
3
4#include <functional>
5
6#include "utils.h"
7#include "configuration.h"
8#include "render.h"
9#include "colormaps.h"
10#include "geometry.h"
11#include "objects_geometry.h"
12#include "data_logger.h"
13
14
15class Simulation;
16class LightLevelMap;
17
18
23class Object {
24public:
33 Object(float _x, float _y, ObjectGeometry& _geom, std::string const& _category = "objects");
34
44 Object(Simulation* simulation, float _x, float _y, Configuration const& config, std::string const& _category = "objects");
45
49 virtual ~Object();
50
51
55 void init(b2WorldId world_id) {
56 if (initialized) {
57 throw std::runtime_error("Object::init() called twice.");
58 }
59 do_init(world_id);
60 initialized = true;
61 }
62
66 bool is_initialized() const noexcept {
67 return initialized;
68 }
69
70
77 virtual void render(SDL_Renderer* renderer, b2WorldId world_id) const = 0;
78
84 virtual void launch_user_step(float f);
85
90
98 virtual void move(float x, float y, float theta = NAN);
99
103 virtual bool is_tangible() const { return false; };
104
110 virtual void serialize_base_values(DataLogger* data_logger, double t);
111
117 virtual void create_serialization_fields(DataLogger* data_logger);
118
130 virtual arena_polygons_t generate_contours(std::size_t points_per_contour = 0) const;
131
132 // Physical information
133 float x;
134 float y;
135 float theta;
136
137 // Base information
138 std::string category;
139
140protected:
147 virtual void do_init([[maybe_unused]] b2WorldId world_id) { }
148
154 virtual void parse_configuration(Configuration const& config, Simulation* simulation);
155
157
158private:
159 bool initialized = false;
160};
161
162
167class PhysicalObject : public Object {
168public:
169
184 PhysicalObject(uint16_t _id, float _x, float _y,
186 float _linear_damping = 0.0f, float _angular_damping = 0.0f,
187 float _density = 10.0f, float _friction = 0.3f, float _restitution = 0.5f,
188 std::string const& _category = "objects");
189
200 PhysicalObject(Simulation* simulation, uint16_t _id, float _x, float _y,
201 Configuration const& config,
202 std::string const& _category = "objects");
203
208 virtual void launch_user_step(float t) override;
209
217 virtual b2Vec2 get_position() const;
218
226 float get_angle() const;
227
233 float get_angular_velocity() const;
234
240 b2Vec2 get_linear_acceleration() const;
241
248 virtual void render(SDL_Renderer* renderer, b2WorldId world_id) const override = 0 ;
249
257 virtual void move(float x, float y, float theta = NAN) override;
258
262 virtual bool is_tangible() const override { return true; };
263
269 virtual void create_serialization_fields(DataLogger* data_logger) override;
270
276 virtual void serialize_base_values(DataLogger* data_logger, double t) override;
277
289 virtual arena_polygons_t generate_contours(std::size_t points_per_contour = 0) const override;
290
291 // Base info
292 uint16_t id;
293
294
295protected:
302 virtual void do_init([[maybe_unused]] b2WorldId world_id) override;
303
309 virtual void parse_configuration(Configuration const& config, Simulation* simulation) override;
310
319 virtual void create_body(b2WorldId world_id);
320
321 // Physical information
324 float density;
325 float friction;
327 b2BodyId body_id;
328
329 // Useful to compute acceleration
330 float _estimated_dt = 0.0f;
331 float _last_time = 0.0f;
332 b2Vec2 _prev_v = {NAN, NAN};
333 b2Vec2 _lin_acc = {NAN, NAN};
334};
335
336
342public:
343
359 PassiveObject(uint16_t _id, float _x, float _y,
361 float _linear_damping = 0.0f, float _angular_damping = 0.0f,
362 float _density = 10.0f, float _friction = 0.3f, float _restitution = 0.5f,
363 std::string _colormap = "rainbow",
364 std::string const& _category = "objects");
365
376 PassiveObject(Simulation* simulation, uint16_t _id, float _x, float _y,
377 Configuration const& config,
378 std::string const& _category = "objects");
379
386 void render(SDL_Renderer* renderer, b2WorldId world_id) const override;
387
388protected:
389 std::string colormap;
390
396 virtual void parse_configuration(Configuration const& config, Simulation* simulation) override;
397};
398
399
410Object* object_factory(Simulation* simulation, uint16_t id, float x, float y, b2WorldId world_id, Configuration const& config, LightLevelMap* light_map, size_t userdatasize = 0, std::string const& category = "objects");
411
421void get_cmap_val(std::string const name, uint8_t const value, uint8_t* r, uint8_t* g, uint8_t* b);
422
423#endif
424
425
426// MODELINE "{{{1
427// vim:expandtab:softtabstop=4:shiftwidth=4:fileencoding=utf-8
428// vim:foldmethod=marker
Class for managing hierarchical configuration parameters.
Definition configuration.h:64
DataLogger class for writing data to a Feather file using Apache Arrow.
Definition data_logger.h:24
A discretized 2D grid representing light intensities over a simulation area.
Definition lights.h:20
Geometry of an object.
Definition objects_geometry.h:40
Base class of any object contained within the simulation.
Definition objects.h:23
virtual void parse_configuration(Configuration const &config, Simulation *simulation)
Parse a provided configuration and set associated members values.
Definition objects.cpp:33
virtual void do_init(b2WorldId world_id)
Perform the base initialization (e.g. create Box2D objects). Called once by init(world_id).
Definition objects.h:147
float y
Y position.
Definition objects.h:134
virtual void create_serialization_fields(DataLogger *data_logger)
Create serialization fields of the data logger.
Definition objects.cpp:48
virtual bool is_tangible() const
Returns whether this object is tangible (e.g. collisions, etc) or not.
Definition objects.h:103
std::string category
Category of the object.
Definition objects.h:138
float x
X position.
Definition objects.h:133
virtual void move(float x, float y, float theta=NAN)
Move the object to a given coordinate.
Definition objects.cpp:41
ObjectGeometry * get_geometry()
Return the object's geometry.
Definition objects.h:89
bool is_initialized() const noexcept
Check if the object was correctly initialized yet.
Definition objects.h:66
virtual void launch_user_step(float f)
Launches the user-defined step function.
Definition objects.cpp:29
void init(b2WorldId world_id)
Launch virtual function 'do_init' that will perform base initialization (e.g. create Box2D objects).
Definition objects.h:55
ObjectGeometry * geom
Geometry of the object.
Definition objects.h:156
virtual void render(SDL_Renderer *renderer, b2WorldId world_id) const =0
Renders the object on the given SDL renderer.
virtual ~Object()
Destructor.
Definition objects.cpp:27
virtual void serialize_base_values(DataLogger *data_logger, double t)
Save base values of the object into a data logger row.
Definition objects.cpp:53
float theta
Orientation (in rad).
Definition objects.h:135
virtual arena_polygons_t generate_contours(std::size_t points_per_contour=0) const
Return one or more polygonal contours that represent the geometry of the object.
Definition objects.cpp:65
Object(float _x, float _y, ObjectGeometry &_geom, std::string const &_category="objects")
Constructs an Object.
Definition objects.cpp:16
virtual void parse_configuration(Configuration const &config, Simulation *simulation) override
Parse a provided configuration and set associated members values.
Definition objects.cpp:270
void render(SDL_Renderer *renderer, b2WorldId world_id) const override
Renders the object on the given SDL renderer.
Definition objects.cpp:246
std::string colormap
Definition objects.h:389
PassiveObject(uint16_t _id, float _x, float _y, ObjectGeometry &geom, float _linear_damping=0.0f, float _angular_damping=0.0f, float _density=10.0f, float _friction=0.3f, float _restitution=0.5f, std::string _colormap="rainbow", std::string const &_category="objects")
Constructs a PassiveObject.
Definition objects.cpp:225
float friction
Definition objects.h:325
virtual void launch_user_step(float t) override
Launches the user-defined step function. For PhysicalObject, it is also used to compute acceleration ...
Definition objects.cpp:97
virtual b2Vec2 get_position() const
Retrieves the object's current position.
Definition objects.cpp:116
virtual void do_init(b2WorldId world_id) override
Perform the base initialization (e.g. create Box2D objects). Called once by init(world_id).
Definition objects.cpp:93
PhysicalObject(uint16_t _id, float _x, float _y, ObjectGeometry &geom, float _linear_damping=0.0f, float _angular_damping=0.0f, float _density=10.0f, float _friction=0.3f, float _restitution=0.5f, std::string const &_category="objects")
Constructs a PhysicalObject.
Definition objects.cpp:73
virtual void move(float x, float y, float theta=NAN) override
Move the object to a given coordinate.
Definition objects.cpp:181
float linear_damping
Definition objects.h:322
float _last_time
Definition objects.h:331
float get_angle() const
Retrieves the object's current orientation angle.
Definition objects.cpp:124
virtual void parse_configuration(Configuration const &config, Simulation *simulation) override
Parse a provided configuration and set associated members values.
Definition objects.cpp:145
b2Vec2 get_linear_acceleration() const
Retrieves the object's current angular velocity.
Definition objects.cpp:141
float restitution
Definition objects.h:326
float angular_damping
Definition objects.h:323
float density
Definition objects.h:324
b2Vec2 _lin_acc
Definition objects.h:333
b2BodyId body_id
Box2D body identifier.
Definition objects.h:327
virtual void create_serialization_fields(DataLogger *data_logger) override
Create serialization fields of the data logger.
Definition objects.cpp:194
virtual void render(SDL_Renderer *renderer, b2WorldId world_id) const override=0
Renders the object on the given SDL renderer.
b2Vec2 _prev_v
Definition objects.h:332
virtual void create_body(b2WorldId world_id)
Creates the object's physical body in the simulation.
Definition objects.cpp:154
virtual arena_polygons_t generate_contours(std::size_t points_per_contour=0) const override
Return one or more polygonal contours that represent the geometry of the object.
Definition objects.cpp:217
uint16_t id
Object identifier.
Definition objects.h:292
float get_angular_velocity() const
Retrieves the object's current angular velocity.
Definition objects.cpp:133
virtual bool is_tangible() const override
Returns whether this object is tangible (e.g. collisions, etc) or not.
Definition objects.h:262
float _estimated_dt
Definition objects.h:330
virtual void serialize_base_values(DataLogger *data_logger, double t) override
Save base values of the object into a data logger row.
Definition objects.cpp:202
Class representing the simulation environment.
Definition simulator.h:43
std::vector< std::vector< b2Vec2 > > arena_polygons_t
Definition geometry.h:13
void get_cmap_val(std::string const name, uint8_t const value, uint8_t *r, uint8_t *g, uint8_t *b)
Interface to colormaps.
Definition objects.cpp:335
Object * object_factory(Simulation *simulation, uint16_t id, float x, float y, b2WorldId world_id, Configuration const &config, LightLevelMap *light_map, size_t userdatasize=0, std::string const &category="objects")
Factory of simulation Objects. Return a constructed object from configuration.
Definition objects.cpp:280
std::unique_ptr< Simulation > simulation
Global simulation instance.
Definition simulator.cpp:74