TDME2  1.9.200
ImposterObject.cpp
Go to the documentation of this file.
2 
3 #include <string>
4 #include <vector>
5 
6 #include <tdme/tdme.h>
7 #include <tdme/engine/Engine.h>
8 #include <tdme/engine/Object.h>
10 #include <tdme/engine/Transform.h>
11 
12 using std::string;
13 using std::vector;
14 
20 
21 ImposterObject::ImposterObject(
22  const string& id,
23  const vector<Model*>& billboardModels
24 ):
25  id(id),
26  billboardModels(billboardModels)
27 {
28  this->enabled = true;
29  this->pickable = false;
30  this->contributesShadows = false;
31  this->receivesShadows = false;
32  this->effectColorMul.set(1.0f, 1.0f, 1.0f, 1.0f);
33  this->effectColorAdd.set(0.0f, 0.0f, 0.0f, 0.0f);
35 
36  billboardObjects.resize(billboardModels.size());
37  for (auto i = 0; i < billboardModels.size(); i++) {
38  billboardObjects[i] = new Object(id + ".bb-" + to_string(i), billboardModels[i]);
39  billboardObjects[i]->setParentEntity(this);
40  }
41 
43 
46 }
47 
49  // delegate to billboard objects
51 }
52 
54 {
55  if (this->engine != nullptr) this->engine->deregisterEntity(this);
56  this->engine = engine;
57  if (engine != nullptr) engine->registerEntity(this);
59 }
60 
62 {
63 }
64 
66 {
67  Transform::setTransform(transform);
68  //
69  auto entityTransform = parentTransform * (*this);
70  entityTransformMatrix = entityTransform.getTransformMatrix();
71  // delegate to billboard objects
72  auto imposterObjectTransform = entityTransform;
73  imposterObjectTransform.addRotation(Vector3(0.0f, 1.0f, 0.0f), 0.0f);
74  imposterObjectTransform.update();
75  for (auto billboardObject: billboardObjects) {
76  billboardObject->setTransform(imposterObjectTransform);
77  imposterObjectTransform.setRotationAngle(
78  imposterObjectTransform.getRotationCount() - 1,
79  imposterObjectTransform.getRotationAngle(imposterObjectTransform.getRotationCount() - 1) -(360.0f / static_cast<float>(billboardModels.size()))
80  );
81  imposterObjectTransform.update();
82  }
83  // update entity
84  if (parentEntity == nullptr && frustumCulling == true && engine != nullptr && enabled == true) engine->partition->updateEntity(this);
85 }
86 
88 {
90  //
91  auto entityTransform = parentTransform * (*this);
92  entityTransformMatrix = entityTransform.getTransformMatrix();
93  // delegate to billboard objects
94  auto imposterObjectTransform = entityTransform;
95  imposterObjectTransform.addRotation(Vector3(0.0f, 1.0f, 0.0f), 0.0f);
96  imposterObjectTransform.update();
97  for (auto billboardObject: billboardObjects) {
98  billboardObject->setTransform(imposterObjectTransform);
99  imposterObjectTransform.setRotationAngle(
100  imposterObjectTransform.getRotationCount() - 1,
101  imposterObjectTransform.getRotationAngle(imposterObjectTransform.getRotationCount() - 1) -(360.0f / static_cast<float>(billboardModels.size()))
102  );
103  imposterObjectTransform.update();
104  }
105  //
106  if (parentEntity == nullptr && frustumCulling == true && engine != nullptr && enabled == true) engine->partition->updateEntity(this);
107 }
108 
109 void ImposterObject::setEnabled(bool enabled)
110 {
111  // return if enable state has not changed
112  if (this->enabled == enabled) return;
113  // frustum if root entity
114  if (parentEntity == nullptr) {
115  // frustum culling enabled?
116  if (frustumCulling == true) {
117  // yeo, add or remove from partition
118  if (enabled == true) {
119  if (engine != nullptr) engine->partition->addEntity(this);
120  } else {
121  if (engine != nullptr) engine->partition->removeEntity(this);
122  }
123  }
124  }
125 }
126 
128  return frustumCulling;
129 }
130 
131 void ImposterObject::setFrustumCulling(bool frustumCulling) {
132  // check if enabled and engine attached
133  if (enabled == true && engine != nullptr) {
134  // had frustum culling
135  if (this->frustumCulling == true) {
136  // yep, remove if set to false now
137  if (frustumCulling == false) engine->partition->removeEntity(this);
138  } else {
139  // yep, add if set to true now
140  if (frustumCulling == true) engine->partition->addEntity(this);
141  }
142  }
143  this->frustumCulling = frustumCulling;
144  // delegate change to engine
145  if (engine != nullptr) engine->updateEntityRegistration(this);
146 }
147 
149 {
150  // delegate to billboard objects
152 }
153 
155 {
156  // delegate to billboard objects
158 }
void set(float r, float g, float b, float a)
Sets this color by its components.
Definition: Color4.h:66
Engine main class.
Definition: Engine.h:131
unique_ptr< Partition > partition
Definition: Engine.h:289
void updateEntityRegistration(Entity *entity)
Updates registration of engine by performing deregisterEntity() and registerEntity()
Definition: Engine.h:1489
void deregisterEntity(Entity *entity)
Removes a entity from internal lists, those entities can also be sub entities from entity hierarchy o...
Definition: Engine.cpp:382
void registerEntity(Entity *entity)
Adds a entity to internal lists, those entities can also be sub entities from entity hierarchy or par...
Definition: Engine.cpp:437
Entity * parentEntity
Definition: Entity.h:39
Imposter object to be used with engine class.
void dispose() override
Dispose this entity.
~ImposterObject()
Public destructor.
void initialize() override
Initiates this entity.
void update() override
Update transform.
void setTransform(const Transform &transform) override
Set transform.
vector< Object * > billboardObjects
void setFrustumCulling(bool frustumCulling) override
Set frustum culling.
void setEngine(Engine *engine) override
Set up engine.
void setEnabled(bool enabled) override
Enable/disable rendering.
vector< Model * > billboardModels
void setRenderer(Renderer *renderer) override
Set up renderer.
Object to be used with engine class.
Definition: Object.h:60
void dispose() override
Dispose this entity.
Definition: Object.cpp:106
void setShader(const string &id)
Set shader.
Definition: Object.cpp:116
void initialize() override
Initiates this entity.
Definition: Object.cpp:111
void setRenderPass(RenderPass renderPass) override
Set render pass.
Definition: Object.h:353
void setTransform(const Transform &transform) override
Set transform.
Definition: Object.cpp:50
void setEngine(Engine *engine) override
Set up engine.
Definition: Object.cpp:39
Transform which contain scale, rotations and translation.
Definition: Transform.h:29
virtual void setTransform(const Transform &transform)
Set transform.
Definition: Transform.h:177
virtual void update()
Computes transform matrix.
Definition: Transform.cpp:33
Matrix4x4 & identity()
Creates identity matrix.
Definition: Matrix4x4.h:158
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
Partition interface.
Definition: Partition.h:18