TDME2  1.9.200
EnvironmentMappingRenderer.cpp
Go to the documentation of this file.
2 
3 #include <memory>
4 #include <vector>
5 
6 #include <tdme/tdme.h>
11 #include <tdme/engine/Camera.h>
12 #include <tdme/engine/Engine.h>
13 #include <tdme/engine/Entity.h>
17 #include <tdme/engine/Light.h>
18 #include <tdme/engine/LODObject.h>
19 #include <tdme/engine/Object.h>
23 #include <tdme/engine/Partition.h>
24 #include <tdme/math/Math.h>
25 #include <tdme/math/Matrix4x4.h>
26 #include <tdme/math/Vector3.h>
27 #include <tdme/utilities/Time.h>
28 
29 using std::make_unique;
30 using std::unique_ptr;
31 using std::vector;
32 
34 
50 using tdme::math::Math;
54 
55 unique_ptr<GeometryBuffer> EnvironmentMappingRenderer::geometryBuffer;
56 
57 EnvironmentMappingRenderer::EnvironmentMappingRenderer(Engine* engine, int32_t width, int32_t height)
58 {
59  this->engine = engine;
60  this->width = width;
61  this->height = height;
62  camera = make_unique<Camera>(engine->getRenderer());
63  camera->setCameraMode(Camera::CAMERAMODE_NONE);
64  if (engine->getRenderer()->getRendererType() == Renderer::RENDERERTYPE_VULKAN) {
65  forwardVectors = {{
66  {{ 1.0f, 0.0f, 0.0f }}, // left
67  {{ -1.0f, 0.0f, 0.0f }}, // right
68  {{ 0.0f, -1.0f, 0.0f }}, // top
69  {{ 0.0f, 1.0f, 0.0f }}, // bottom
70  {{ 0.0f, 0.0f, 1.0f }}, // front
71  {{ 0.0f, 0.0f, -1.0f }} // back
72  }};
73  sideVectors = {{
74  {{ 0.0f, 0.0f, -1.0f }}, // left
75  {{ 0.0f, 0.0f, 1.0f }}, // right
76  {{ 1.0f, 0.0f, 0.0f }}, // top
77  {{ 1.0f, 0.0f, 0.0f }}, // bottom
78  {{ 1.0f, 0.0f, 0.0f }}, // front
79  {{ -1.0f, 0.0f, 0.0f }} // back
80  }};
81  } else {
82  forwardVectors = {{
83  {{ -1.0f, 0.0f, 0.0f }}, // left
84  {{ 1.0f, 0.0f, 0.0f }}, // right
85  {{ 0.0f, 1.0f, 0.0f }}, // top
86  {{ 0.0f, -1.0f, 0.0f }}, // bottom
87  {{ 0.0f, 0.0f, 1.0f }}, // front
88  {{ 0.0f, 0.0f, -1.0f }} // back
89  }};
90  sideVectors = {{
91  {{ 0.0f, 0.0f, 1.0f }}, // left
92  {{ 0.0f, 0.0f, -1.0f }}, // right
93  {{ 1.0f, 0.0f, 0.0f }}, // top
94  {{ 1.0f, 0.0f, 0.0f }}, // bottom
95  {{ 1.0f, 0.0f, 0.0f }}, // front
96  {{ -1.0f, 0.0f, 0.0f }} // back
97  }};
98  }
99 }
100 
102 }
103 
105 {
106  //
107  for (auto i = 0; i < frameBuffers.size(); i++) {
109  for (auto j = 0; j < frameBuffers[i].size(); j++) {
111  frameBuffers[i][j]->initialize();
112  }
113  }
114  // deferred shading
115  if (engine->getRenderer()->isDeferredShadingAvailable() == true && geometryBuffer == nullptr) {
116  geometryBuffer = make_unique<GeometryBuffer>(width, height);
117  geometryBuffer->initialize();
118  } else
119  if (geometryBuffer != nullptr) {
120  // TODO: fix me by using a hash map or something to match static geometry buffers with env maps of given dimension
121  if (geometryBuffer->getWidth() != width || geometryBuffer->getHeight() != height) {
122  Console::println("EnvironmentMappingRenderer::initialize(): " + to_string(geometryBuffer->getId()) + ": geometry buffer width != width, height != height!");
123  }
124  }
125 }
126 
127 void EnvironmentMappingRenderer::reshape(int32_t width, int32_t height)
128 {
129 }
130 
132 {
133  for (auto i = 0; i < frameBuffers.size(); i++) {
134  for (auto j = 0; j < frameBuffers[i].size(); j++) {
135  frameBuffers[i][j]->dispose();
136  }
138  }
139 }
140 
142 {
143  //
144  auto now = Time::getCurrentMillis();
145  if (timeRenderLast != -1LL && now - timeRenderLast < timeRenderUpdateFrequency) return;
146 
147  //
148  auto engineCamera = engine->getCamera();
149 
150  //
151  for (auto runs = 0; runs < (timeRenderLast == -1LL?2:1); runs++) {
152  //
155 
156  //
157  for (auto i = 0; i < frameBuffers[renderCubeMapTextureIdx].size(); i++) {
158  // bind frame buffer
159  frameBuffers[renderCubeMapTextureIdx][i]->enableFrameBuffer();
160 
161  // set up camera
162  camera->setZNear(engineCamera->getZNear());
163  camera->setZFar(engineCamera->getZFar());
164  camera->setFovX(90.0f);
165  camera->setLookFrom(position);
166  camera->setForwardVector(forwardVectors[i]);
167  camera->setSideVector(sideVectors[i]);
168  camera->setUpVector(Vector3::computeCrossProduct(sideVectors[i], forwardVectors[i]));
170  camera->getFrustum()->update();
171 
172  // TODO: if we dont use a geometry buffer, we need to clear frame buffer
173  if (geometryBuffer == nullptr) {
174  // set up clear color
180  );
181 
182  // clear previous frame values
184  }
185 
186  //
187  engine->preRender(camera.get(), visibleDecomposedEntities, false, false);
188 
189  // do a render pass
190  engine->render(
192  geometryBuffer.get(),
193  camera.get(),
197  string(),
198  false,
199  false,
200  true,
201  true,
202  EntityRenderer::RENDERTYPE_NORMALS |
203  EntityRenderer::RENDERTYPE_TEXTUREARRAYS |
204  EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY |
205  EntityRenderer::RENDERTYPE_EFFECTCOLORS |
206  EntityRenderer::RENDERTYPE_MATERIALS |
207  EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY |
208  EntityRenderer::RENDERTYPE_TEXTURES |
209  EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY |
210  EntityRenderer::RENDERTYPE_LIGHTS,
212  );
213 
214  //
216  }
217  }
218 
219  // unbind frame buffer
221 
222  //
223  timeRenderLast = now;
224 }
float getRed() const
Definition: Color4.h:92
float getGreen() const
Definition: Color4.h:107
float getAlpha() const
Definition: Color4.h:137
float getBlue() const
Definition: Color4.h:122
Engine main class.
Definition: Engine.h:131
Camera * getCamera()
Definition: Engine.h:1071
static Renderer * getRenderer()
Definition: Engine.h:434
void render(FrameBuffer *renderFrameBuffer, GeometryBuffer *renderGeometryBuffer, Camera *rendererCamera, DecomposedEntities &visibleDecomposedEntities, int32_t effectPass, int32_t renderPassMask, const string &shaderPrefix, bool applyShadowMapping, bool applyPostProcessing, bool doRenderLightSource, bool doRenderParticleSystems, int32_t renderTypes, bool skyShaderEnabled)
Do a render/effect pass.
Definition: Engine.cpp:2304
void resetLists(DecomposedEntities &decomposedEntites)
Reset lists.
Definition: Engine.cpp:1057
void preRender(Camera *camera, DecomposedEntities &decomposedEntites, bool autoEmit, bool computeAnimations)
Computes visibility and animations and other pre render steps.
Definition: Engine.cpp:1233
Entity hierarchy to be used with engine class.
Engine entity.
Definition: Entity.h:30
Frame buffer class.
Definition: FrameBuffer.h:22
static void disableFrameBuffer()
Switches back to non offscreen main frame buffer to be rendered.
static constexpr int32_t FRAMEBUFFER_COLORBUFFER
Definition: FrameBuffer.h:26
static constexpr int32_t FRAMEBUFFER_DEPTHBUFFER
Definition: FrameBuffer.h:25
LOD object to be used with engine class.
Definition: LODObject.h:49
Light representation.
Definition: Light.h:33
Object particle system entity to be used with engine class.
Object render group for static objects that might be animated by shaders.
Object to be used with engine class.
Definition: Object.h:60
Axis aligned bounding box used for frustum, this is not directly connectable with physics engine.
Definition: BoundingBox.h:26
void reshape(int32_t width, int32_t height)
Reshape frame buffers.
static STATIC_DLL_IMPEXT unique_ptr< GeometryBuffer > geometryBuffer
void render(const Vector3 &position)
Renders given objects in to environment cube map.
virtual void setClearColor(float red, float green, float blue, float alpha)=0
Set up clear color.
virtual void disposeTexture(int32_t textureId)=0
Dispose a texture.
virtual int32_t createCubeMapTexture(int contextIdx, int32_t width, int32_t height)=0
Create cube map texture from frame buffers.
virtual void clear(int32_t mask)=0
Clear render buffer with given mask.
Standard math functions.
Definition: Math.h:19
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Definition: Matrix4x4.h:23
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
Time utility class.
Definition: Time.h:20
Partition interface.
Definition: Partition.h:18