Helios++
Helios software for LiDAR simulations
DynObject.h
1 #pragma once
2 
3 #include <string>
4 #include <vector>
5 #include <armadillo>
6 
7 #include <assetloading/ScenePart.h>
8 #include <sim/tools/NonVoidStepLoop.h>
9 
10 using std::vector;
11 using std::string;
12 
23 class DynObject : public ScenePart{
24 private:
25  // *** SERALIZATION *** //
26  // ********************** //
27  friend class boost::serialization::access;
34  template <typename Archive>
35  void serialize(Archive &ar, const unsigned int version){
36  boost::serialization::split_member(ar, *this, version);
37  }
43  template <typename Archive>
44  void save(Archive &ar, const unsigned int version) const{
45  boost::serialization::void_cast_register<DynObject, ScenePart>();
46  ar &boost::serialization::base_object<ScenePart>(*this);
48  }
54  template <typename Archive>
55  void load(Archive &ar, const unsigned int version) {
56  boost::serialization::void_cast_register<DynObject, ScenePart>();
57  ar &boost::serialization::base_object<ScenePart>(*this);
58  int stepInterval;
59  ar &stepInterval;
60  stepLoop.setStepInterval(stepInterval);
61  }
62 
63 protected:
64  // *** ATTRIBUTES *** //
65  // ******************** //
72 
73 public:
74  // *** CONSTRUCTION / DESTRUCTION *** //
75  // ************************************ //
80  stepLoop(1, [&] () -> bool{return doSimStep();})
81  {}
87  DynObject(ScenePart const &sp, bool const shallowPrimitives=false) :
88  ScenePart(sp, shallowPrimitives),
89  stepLoop(1, [&] () -> bool{return doSimStep();})
90  {}
96  DynObject(string const id) :
97  stepLoop(1, [&] () -> bool{return doSimStep();})
98  {setId(id);}
104  DynObject(vector<Primitive *> const &primitives) :
105  stepLoop(1, [&] () -> bool{return doSimStep();})
106  {setPrimitives(primitives);}
114  DynObject(string const id, vector<Primitive *> const &primitives) :
115  stepLoop(1, [&] () -> bool{return doSimStep();})
116  {
117  setId(id);
118  setPrimitives(primitives);
119  }
120  virtual ~DynObject() = default;
121 
122  // *** DYNAMIC BEHAVIOR *** //
123  // ************************** //
134  virtual bool doStep();
155  virtual bool doSimStep() = 0;
160  inline void operator() () {doStep();}
161 
162  // *** U T I L *** //
163  // ***************** //
172  size_t countVertices() const;
187  arma::mat positionMatrixFromPrimitives() const;
202  arma::mat positionMatrixFromPrimitives(size_t const m) const;
217  arma::mat normalMatrixFromPrimitives() const;
232  arma::mat normalMatrixFromPrimitives(size_t const m) const;
245  void updatePrimitivesPositionFromMatrix(arma::mat const &X);
259  void updatePrimitivesPositionFromMatrix(
260  size_t const m,
261  arma::mat const &X
262  );
275  void updatePrimitivesNormalFromMatrix(arma::mat const &X);
289  void updatePrimitivesNormalFromMatrix(size_t const m, arma::mat const &X);
290 protected:
319  arma::mat matrixFromPrimitives(
320  std::function<arma::colvec(Vertex const *)> get
321  ) const ;
336  arma::mat matrixFromPrimitives(
337  size_t const m,
338  std::function<arma::colvec(Vertex const *)> get
339  ) const ;
368  void matrixToPrimitives(
369  std::function<void(Vertex *, arma::colvec const &)> set,
370  arma::mat const &X
371  );
386  void matrixToPrimitives(
387  size_t const m,
388  std::function<void(Vertex *, arma::colvec const &)> set,
389  arma::mat const &X
390  );
391 
392 public:
393  // *** GETTERs and SETTERs *** //
394  // ***************************** //
398  ObjectType getType() const override {return ObjectType::DYN_OBJECT;}
406  inline int getStepInterval() const
407  {return stepLoop.getStepInterval();}
415  inline void setStepInterval(int const stepInterval)
416  {stepLoop.setStepInterval(stepInterval);}
417 };
Dynamic object base implementation.
Definition: DynObject.h:23
void load(Archive &ar, const unsigned int version)
Load a serialized dynamic object from a stream of bytes.
Definition: DynObject.h:55
void setStepInterval(int const stepInterval)
Set the step interval for the dynamic object.
Definition: DynObject.h:415
int getStepInterval() const
Obtain the current step interval for the dynamic object.
Definition: DynObject.h:406
DynObject()
Dynamic object default constructor.
Definition: DynObject.h:79
DynObject(string const id, vector< Primitive * > const &primitives)
Dynamic object constructor with id and primitives as arguments.
Definition: DynObject.h:114
DynObject(vector< Primitive * > const &primitives)
Dynamic object constructor with primitives as argument.
Definition: DynObject.h:104
DynObject(string const id)
Dynamic object constructor with id as argument.
Definition: DynObject.h:96
DynObject(ScenePart const &sp, bool const shallowPrimitives=false)
Build the dynamic object from given scene part.
Definition: DynObject.h:87
void save(Archive &ar, const unsigned int version) const
Save a serialized dynamic object to a stream of bytes.
Definition: DynObject.h:44
NonVoidStepLoop< bool > stepLoop
The object to handle the execution of the dynamic object logic between specified simulation steps.
Definition: DynObject.h:71
ObjectType getType() const override
Definition: DynObject.h:398
virtual bool doSimStep()=0
Any dynamic object concrete implementation must override this method providing dynamic behavior to th...
void serialize(Archive &ar, const unsigned int version)
Serialize a dynamic object to a stream of bytes.
Definition: DynObject.h:35
Class representing a scene part.
Definition: ScenePart.h:20
ObjectType
Specify the type of scene part / object. By default, the ScenePart is a static object.
Definition: ScenePart.h:53
virtual int getStepInterval() const
Obtain the step interval.
Definition: StepLoop.h:108
virtual void setStepInterval(int const stepInterval)
Set the step interval.
Definition: StepLoop.h:114
Class representing a vertex.
Definition: Vertex.h:14