TDME2  1.9.200
ImposterObject.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <string>
4 #include <vector>
5 
6 #include <tdme/tdme.h>
7 #include <tdme/engine/fwd-tdme.h>
9 #include <tdme/engine/Color4.h>
13 #include <tdme/engine/Camera.h>
14 #include <tdme/engine/Entity.h>
16 #include <tdme/engine/Object.h>
17 #include <tdme/engine/Rotation.h>
18 #include <tdme/engine/Transform.h>
19 #include <tdme/math/Matrix4x4.h>
20 #include <tdme/math/Vector3.h>
21 #include <tdme/utilities/Console.h>
22 
23 using std::string;
24 using std::to_string;
25 using std::vector;
26 
41 
42 /**
43  * Imposter object to be used with engine class
44  * @author Andreas Drewke
45  */
47  public Transform,
48  public Entity
49 {
50  friend class LODObjectImposter;
51 
52 private:
53  Engine* engine { nullptr };
54  bool frustumCulling { true };
55 
56  vector<Model*> billboardModels;
57 
58  string id;
59  vector<Object*> billboardObjects;
60  Object* billboardObject { nullptr };
61 
62  bool enabled;
63  bool pickable;
69  string shaderId { "default" };
70 
72 
75 
76  // overridden methods
77  inline void setParentTransform(const Transform& parentTransform) override {
78  //
79  this->parentTransform = parentTransform;
80  auto entityTransform = parentTransform * (*this);
81  entityTransformMatrix = entityTransform.getTransformMatrix();
82  // delegate to LOD objects
83  for (auto billboardObject: billboardObjects) billboardObject->setTransform(entityTransform);
84  }
85 
86 public:
87  // forbid class copy
89 
90  /**
91  * Public constructor
92  * @param id id
93  * @param billboardModels billboard models
94  */
96  const string& id,
97  const vector<Model*>& billboardModels
98  );
99 
100  /**
101  * Public destructor
102  */
103  ~ImposterObject();
104 
105  // overridden method
106  inline EntityType getEntityType() override {
108  }
109 
110  /**
111  * @return billboard objects
112  */
113  inline const vector<Object*> getBillboardObjects() {
114  return billboardObjects;
115  }
116 
117  /**
118  * @return billboard object
119  */
121  //
122  return billboardObject;
123  }
124 
125  /**
126  * Get current billboard object
127  * @param camera camera
128  * @return LOD object to render
129  */
131  Vector3 cameraForwardVector = getWorldBoundingBox()->getCenter().clone().sub(camera->getLookFrom()).setY(0.0f).normalize();
132  auto angle = Vector3::computeAngle(cameraForwardVector, Vector3(0.0, 0.0f, 1.0f), Rotation::Y_AXIS);
133  auto imposterIdx = static_cast<int>(angle / 360.0f * billboardModels.size() + billboardModels.size() / 2) % billboardModels.size();
134  billboardObject = billboardObjects[imposterIdx];
135  // done
136  return billboardObject;
137  }
138 
139  // overridden methods
140  void setEngine(Engine* engine) override;
141  void setRenderer(Renderer* renderer) override;
142  void initialize() override;
143  void dispose() override;
144 
145  inline bool isEnabled() override {
146  return enabled;
147  }
148 
149  void setEnabled(bool enabled) override;
150  bool isFrustumCulling() override;
151  void setFrustumCulling(bool frustumCulling) override;
152  void update() override;
153 
154  inline BoundingBox* getBoundingBox() override {
156  }
157 
158  inline BoundingBox* getWorldBoundingBox() override {
160  }
161 
162  inline const Color4& getEffectColorMul() const override {
163  return effectColorMul;
164  }
165 
166  inline void setEffectColorMul(const Color4& effectColorMul) override {
167  this->effectColorMul = effectColorMul;
169  }
170 
171  inline const Color4& getEffectColorAdd() const override {
172  return effectColorAdd;
173  }
174 
175  inline void setEffectColorAdd(const Color4& effectColorAdd) override {
176  this->effectColorAdd = effectColorAdd;
178  }
179 
180  inline const string& getId() override {
181  return id;
182  }
183 
184  inline bool isPickable() override {
185  return pickable;
186  }
187 
188  inline bool isContributesShadows() override {
189  return contributesShadows;
190  }
191 
192  inline void setContributesShadows(bool contributesShadows) override {
193  this->contributesShadows = contributesShadows;
195  }
196 
197  inline bool isReceivesShadows() override {
198  return receivesShadows;
199  }
200 
201  inline void setReceivesShadows(bool receivesShadows) override {
202  this->receivesShadows = receivesShadows;
204  }
205 
206  inline void setPickable(bool pickable) override {
207  this->pickable = pickable;
208  }
209 
210  inline const Matrix4x4 getNodeTransformMatrix(const string& id) {
212  }
213 
214  inline const Vector3& getTranslation() const override {
215  return Transform::getTranslation();
216  }
217 
218  inline void setTranslation(const Vector3& translation) override {
220  }
221 
222  inline const Vector3& getScale() const override {
223  return Transform::getScale();
224  }
225 
226  inline void setScale(const Vector3& scale) override {
228  }
229 
230  inline const int getRotationCount() const override {
232  }
233 
234  inline Rotation& getRotation(const int idx) override {
235  return Transform::getRotation(idx);
236  }
237 
238  inline void addRotation(const Vector3& axis, const float angle) override {
239  Transform::addRotation(axis, angle);
240  }
241 
242  inline void removeRotation(const int idx) override {
244  }
245 
246  inline const Vector3& getRotationAxis(const int idx) const override {
247  return Transform::getRotationAxis(idx);
248  }
249 
250  inline void setRotationAxis(const int idx, const Vector3& axis) override {
251  Transform::setRotationAxis(idx, axis);
252  }
253 
254  inline const float getRotationAngle(const int idx) const override {
255  return Transform::getRotationAngle(idx);
256  }
257 
258  inline void setRotationAngle(const int idx, const float angle) override {
259  Transform::setRotationAngle(idx, angle);
260  }
261 
262  inline const Quaternion& getRotationsQuaternion() const override {
264  }
265 
266  inline const Matrix4x4& getTransformMatrix() const override {
267  return entityTransformMatrix;
268  }
269 
270  inline const Transform& getParentTransform() const override {
271  return parentTransform;
272  }
273 
274  inline const Transform& getTransform() const override {
275  return *this;
276  }
277 
278  void setTransform(const Transform& transform) override;
279 
280  inline RenderPass getRenderPass() const override {
281  return renderPass;
282  }
283 
284  inline void setRenderPass(RenderPass renderPass) override {
285  this->renderPass = renderPass;
287  }
288 
289  /**
290  * @return shader id
291  */
292  inline const string& getShader() {
293  return shaderId;
294  }
295 
296  /**
297  * Set shader id
298  * @param id shader
299  */
300  inline void setShader(const string& id) {
301  this->shaderId = id;
302  shaderParameters.setShader(shaderId);
304  }
305 
306  /**
307  * Returns shader parameter for given parameter name, if the value does not exist, the default will be returned
308  * @param shaderId shader id
309  * @param parameterName parameter name
310  * @return shader parameter
311  */
312  inline const ShaderParameter getShaderParameter(const string& parameterName) {
313  return shaderParameters.getShaderParameter(parameterName);
314  }
315 
316  /**
317  * Set shader parameter for given parameter name
318  * @param shaderId shader id
319  * @param parameterName parameter name
320  * @param paraemterValue parameter value
321  */
322  inline void setShaderParameter(const string& parameterName, const ShaderParameter& parameterValue) {
323  shaderParameters.setShaderParameter(parameterName, parameterValue);
324  for (auto billboardObject: billboardObjects) billboardObject->setShaderParameter(parameterName, parameterValue);
325  }
326 
327 };
const Vector3 & getLookFrom() const
Definition: Camera.h:219
Color 4 definition class.
Definition: Color4.h:18
Engine main class.
Definition: Engine.h:131
TDME2 engine entity shader parameters.
void setShaderParameter(const string &parameterName, const ShaderParameter &parameterValue)
Set shader parameter for given parameter name.
void setShader(const string &shaderId)
Set shader.
const ShaderParameter getShaderParameter(const string &parameterName) const
Returns shader parameter for given parameter name, if the value does not exist, the default will be r...
Engine entity.
Definition: Entity.h:30
@ ENTITYTYPE_IMPOSTEROBJECT
Definition: Entity.h:91
Imposter object to be used with engine class.
BoundingBox * getBoundingBox() override
const Vector3 & getTranslation() const override
const Transform & getTransform() const override
RenderPass getRenderPass() const override
void dispose() override
Dispose this entity.
void setShader(const string &id)
Set shader id.
void setTranslation(const Vector3 &translation) override
Set translation.
~ImposterObject()
Public destructor.
void removeRotation(const int idx) override
Remove rotation.
Rotation & getRotation(const int idx) override
Get rotation at given index.
const int getRotationCount() const override
Object * determineBillboardObject(Camera *camera)
Get current billboard object.
const Vector3 & getRotationAxis(const int idx) const override
void initialize() override
Initiates this entity.
bool isReceivesShadows() override
EntityShaderParameters shaderParameters
const vector< Object * > getBillboardObjects()
void setRenderPass(RenderPass renderPass) override
Set render pass.
void setReceivesShadows(bool receivesShadows) override
Enable/disable receives shadows.
void addRotation(const Vector3 &axis, const float angle) override
Add rotation.
void update() override
Update transform.
const Matrix4x4 getNodeTransformMatrix(const string &id)
void setPickable(bool pickable) override
Set this entity pickable.
void setEffectColorMul(const Color4 &effectColorMul) override
Set effect color that will be multiplied with fragment color.
const ShaderParameter getShaderParameter(const string &parameterName)
Returns shader parameter for given parameter name, if the value does not exist, the default will be r...
void setShaderParameter(const string &parameterName, const ShaderParameter &parameterValue)
Set shader parameter for given parameter name.
void setTransform(const Transform &transform) override
Set transform.
vector< Object * > billboardObjects
const Quaternion & getRotationsQuaternion() const override
void setScale(const Vector3 &scale) override
Set scale.
bool isContributesShadows() override
const Vector3 & getScale() const override
const float getRotationAngle(const int idx) const override
BoundingBox * getWorldBoundingBox() override
const Color4 & getEffectColorMul() const override
The effect color will be multiplied with fragment color.
ImposterObject(const string &id, const vector< Model * > &billboardModels)
Public constructor.
void setFrustumCulling(bool frustumCulling) override
Set frustum culling.
void setEngine(Engine *engine) override
Set up engine.
void setEnabled(bool enabled) override
Enable/disable rendering.
const Transform & getParentTransform() const override
const Matrix4x4 & getTransformMatrix() const override
const string & getId() override
EntityType getEntityType() override
void setContributesShadows(bool contributesShadows) override
Enable/disable contributes shadows.
void setRotationAxis(const int idx, const Vector3 &axis) override
Set rotation axis.
vector< Model * > billboardModels
void setEffectColorAdd(const Color4 &effectColorAdd) override
Set effect color that will be added to fragment color.
const Color4 & getEffectColorAdd() const override
The effect color will be added to fragment color.
void setParentTransform(const Transform &parentTransform) override
Set parent transform.
void setRenderer(Renderer *renderer) override
Set up renderer.
void setRotationAngle(const int idx, const float angle) override
LOD object + imposter to be used with engine class.
Object to be used with engine class.
Definition: Object.h:60
BoundingBox * getBoundingBox() override
Definition: Object.h:231
void setShader(const string &id)
Set shader.
Definition: Object.cpp:116
void setRenderPass(RenderPass renderPass) override
Set render pass.
Definition: Object.h:353
void setReceivesShadows(bool receivesShadows) override
Enable/disable receives shadows.
Definition: Object.h:271
void setEffectColorMul(const Color4 &effectColorMul) override
Set effect color that will be multiplied with fragment color.
Definition: Object.h:251
void setShaderParameter(const string &parameterName, const ShaderParameter &parameterValue)
Set shader parameter for given parameter name.
Definition: Object.h:468
void setTransform(const Transform &transform) override
Set transform.
Definition: Object.cpp:50
BoundingBox * getWorldBoundingBox() override
Definition: Object.h:235
void setContributesShadows(bool contributesShadows) override
Enable/disable contributes shadows.
Definition: Object.h:263
void setEffectColorAdd(const Color4 &effectColorAdd) override
Set effect color that will be added to fragment color.
Definition: Object.h:243
Rotation representation.
Definition: Rotation.h:18
static STATIC_DLL_IMPEXT Vector3 Y_AXIS
Definition: Rotation.h:22
Shader parameter model class.
Transform which contain scale, rotations and translation.
Definition: Transform.h:29
void setRotationAngle(const int idx, const float angle)
Definition: Transform.h:155
void setRotationAxis(const int idx, const Vector3 &axis)
Set rotation axis.
Definition: Transform.h:138
void setTranslation(const Vector3 &translation)
Set translation.
Definition: Transform.h:64
void removeRotation(const int idx)
Remove rotation.
Definition: Transform.h:121
const Vector3 & getScale() const
Definition: Transform.h:71
Rotation & getRotation(const int idx)
Get rotation at given index.
Definition: Transform.h:95
void setScale(const Vector3 &scale)
Set scale.
Definition: Transform.h:79
const int getRotationCount() const
Definition: Transform.h:86
const Vector3 & getRotationAxis(const int idx) const
Definition: Transform.h:129
const Quaternion & getRotationsQuaternion() const
Definition: Transform.h:162
const Vector3 & getTranslation() const
Definition: Transform.h:56
void addRotation(const Vector3 &axis, const float angle)
Add rotation.
Definition: Transform.h:113
const float getRotationAngle(const int idx) const
Definition: Transform.h:146
Representation of a 3D model.
Definition: Model.h:35
Axis aligned bounding box used for frustum, this is not directly connectable with physics engine.
Definition: BoundingBox.h:26
const Vector3 & getCenter() const
Definition: BoundingBox.h:121
const Matrix4x4 getNodeTransformMatrix(const string &id)
Returns transform matrix for given node.
Definition: ObjectBase.h:269
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Definition: Matrix4x4.h:23
Quaternion class representing quaternion mathematical structure and operations with x,...
Definition: Quaternion.h:24
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
Vector3 & setY(float y)
Sets y component.
Definition: Vector3.h:126
Vector3 clone() const
Clones this vector3.
Definition: Vector3.h:374
Vector3 & sub(float scalar)
Subtracts a scalar.
Definition: Vector3.h:177
Vector3 & normalize()
Normalizes this vector3.
Definition: Vector3.h:239
Console class.
Definition: Console.h:29
#define FORBID_CLASS_COPY(CLASS)
Definition: tdme.h:6