88 using std::make_unique;
94 using std::unique_ptr;
172 Engine* Engine::instance =
nullptr;
173 Renderer* Engine::renderer =
nullptr;
174 unique_ptr<TextureManager> Engine::textureManager;
175 unique_ptr<VBOManager> Engine::vboManager;
176 unique_ptr<MeshManager> Engine::meshManager;
177 unique_ptr<GUIRenderer> Engine::guiRenderer;
178 unique_ptr<BRDFLUTShader> Engine::brdfLUTShader;
179 unique_ptr<FrameBufferRenderShader> Engine::frameBufferRenderShader;
180 unique_ptr<DeferredLightingRenderShader> Engine::deferredLightingRenderShader;
181 unique_ptr<SkyRenderShader> Engine::skyRenderShader;
182 unique_ptr<PostProcessing> Engine::postProcessing;
183 unique_ptr<PostProcessingShader> Engine::postProcessingShader;
184 unique_ptr<Texture2DRenderShader> Engine::texture2DRenderShader;
185 Engine::AnimationProcessingTarget Engine::animationProcessingTarget = Engine::AnimationProcessingTarget::CPU;
186 unique_ptr<ShadowMapCreationShader> Engine::shadowMappingShaderPre;
187 unique_ptr<ShadowMapRenderShader> Engine::shadowMappingShaderRender;
188 unique_ptr<LightingShader> Engine::lightingShader;
189 unique_ptr<ParticlesShader> Engine::particlesShader;
190 unique_ptr<LinesShader> Engine::linesShader;
191 unique_ptr<SkinningShader> Engine::skinningShader;
192 unique_ptr<GUIShader> Engine::guiShader;
193 Engine* Engine::currentEngine =
nullptr;
194 bool Engine::skinningShaderEnabled =
false;
195 int Engine::threadCount = 0;
196 bool Engine::have4K =
false;
197 float Engine::animationBlendingTime = 250.0f;
198 int32_t Engine::shadowMapWidth = 0;
199 int32_t Engine::shadowMapHeight = 0;
200 int32_t Engine::shadowMapRenderLookUps = 0;
201 int32_t Engine::environmentMappingWidth = 1024;
202 int32_t Engine::environmentMappingHeight = 1024;
203 float Engine::animationComputationReduction1Distance = 25.0f;
204 float Engine::animationComputationReduction2Distance = 50.0f;
205 list<Engine::Shader> Engine::shaders;
206 unordered_map<string, Engine::Shader*> Engine::shadersById;
207 unordered_map<string, uint8_t> Engine::uniqueShaderIds;
209 vector<unique_ptr<Engine::EngineThread>> Engine::engineThreads;
210 unique_ptr<Queue<Engine::EngineThreadQueueElement>> Engine::engineThreadsQueue;
211 Engine::EngineThreadQueueElementPool Engine::engineThreadQueueElementPool;
222 Console::println(
"EngineThread::" +
string(__FUNCTION__) +
"()[" + to_string(idx) +
"]: INIT");
223 while (isStopRequested() ==
false) {
224 auto element = queue->getElement();
225 if (element ==
nullptr)
break;
226 switch(element->type) {
230 element->engine->preRenderFunction(
234 element->objects.clear();
238 element->engine->computeAnimationsFunction(
242 element->objects.clear();
246 element->engine->entityRenderer->renderFunction(
248 element->rendering.renderPass,
251 element->rendering.collectTransparentFaces,
252 element->rendering.renderTypes,
253 transparentRenderFacesPool.get()
255 element->objects.clear();
260 Console::println(
"EngineThread::" +
string(__FUNCTION__) +
"()[" + to_string(idx) +
"]: DONE");
270 timing = make_unique<Timing>();
300 Console::println(
string(
"Engine::createOffScreenInstance(): Engine not created or not initialized."));
304 auto offScreenEngine =
new Engine();
305 offScreenEngine->initialized =
true;
307 offScreenEngine->gui = make_unique<GUI>(offScreenEngine,
guiRenderer.get());
309 offScreenEngine->entityRenderer = make_unique<EntityRenderer>(offScreenEngine,
renderer);
310 offScreenEngine->entityRenderer->initialize();
313 offScreenEngine->frameBuffer->initialize();
315 offScreenEngine->camera = make_unique<Camera>(
renderer);
316 offScreenEngine->gizmoCamera = make_unique<Camera>(
renderer);
319 offScreenEngine->gizmoCamera->setForwardVector(
Vector3(0.0f, 0.0f, -1.0f));
320 offScreenEngine->gizmoCamera->setSideVector(
Vector3(1.0f, 0.0f, 0.0f));
321 offScreenEngine->gizmoCamera->setUpVector(
Vector3(0.0f, 1.0f, 0.0f));
322 offScreenEngine->gizmoCamera->setZNear(1.0f);
323 offScreenEngine->gizmoCamera->setZFar(400.0f);
324 offScreenEngine->partition = make_unique<OctTreePartition>();
326 for (
auto i = 0; i < offScreenEngine->lights.size(); i++) {
327 offScreenEngine->lights[i] = make_unique<Light>(
renderer, i);
328 offScreenEngine->lights[i]->setSourceTexture(TextureReader::read(
"resources/engine/textures",
"sun.png"));
332 offScreenEngine->shadowMapping = make_unique<ShadowMapping>(offScreenEngine,
renderer, offScreenEngine->entityRenderer.get());
336 offScreenEngine->geometryBuffer = make_unique<GeometryBuffer>(
width,
height);
337 offScreenEngine->geometryBuffer->initialize();
341 return offScreenEngine;
354 this->partition = unique_ptr<Partition>(
partition);
363 if (entity == entityByIdIt->second) {
364 Console::println(
"Engine::addEntity(): " + entity->
getId() +
": entity already added!");
400 array<vector<Object*>*, 5> objectsArray = {
407 for (
auto& objects: objectsArray) {
408 for (
auto object: *objects) {
420 for (
auto ppsEntity: decomposedEntities.
ppses) {
421 auto entityType = ppsEntity->getEntityType();
422 switch (entityType) {
458 auto particleSystemEntity =
dynamic_cast<ParticleSystem*
>(entity);
459 if (particleSystemEntity !=
nullptr && particleSystemEntity->isAutoEmit() ==
true) {
467 array<vector<Object*>*, 5> objectsArray = {
474 for (
auto& objects: objectsArray) {
475 for (
auto object: *objects) {
487 for (
auto ppsEntity: decomposedEntities.
ppses) {
488 auto entityType = ppsEntity->getEntityType();
489 switch (entityType) {
509 auto entity = entityByIdIt->second;
519 if (entity->isFrustumCulling() ==
true && entity->isEnabled() ==
true)
partition->removeEntity(entity);
526 entity->setEngine(
nullptr);
527 entity->setRenderer(
nullptr);
536 decomposedEntities.
objects.erase(
538 decomposedEntities.
objects.begin(),
539 decomposedEntities.
objects.end(),
542 decomposedEntities.
objects.end()
584 decomposedEntities.
opses.erase(
586 decomposedEntities.
opses.begin(),
587 decomposedEntities.
opses.end(),
590 decomposedEntities.
opses.end()
592 decomposedEntities.
ppses.erase(
594 decomposedEntities.
ppses.begin(),
595 decomposedEntities.
ppses.end(),
598 decomposedEntities.
ppses.end()
600 decomposedEntities.
psgs.erase(
602 decomposedEntities.
psgs.begin(),
603 decomposedEntities.
psgs.end(),
606 decomposedEntities.
psgs.end()
676 if (entity ==
nullptr)
return;
685 for (
auto subEntity: ops->getObjects()) {
691 for (
auto subEntity: eh->getEntities()) {
696 auto lo =
static_cast<LODObject*
>(entity);
718 vector<string> entitiesToRemove;
720 entitiesToRemove.push_back(entityId);
722 for (
const auto& entityKey: entitiesToRemove) {
743 renderer = Application::getRenderer();
746 Console::println(
"No renderer: Exiting!");
747 Application::exit(0);
765 if (
threadCount == 0)
threadCount = Math::clamp(Thread::getHardwareThreadCount() == 0?3:Thread::getHardwareThreadCount() / 2, 2, 3);
770 Console::println(
string(
"TDME2::Thread count: ") + to_string(
threadCount));
773 ObjectBuffer::initialize();
786 Console::println(
string(
"TDME2::Renderer::Graphics Vendor: ") +
renderer->
getVendor());
787 Console::println(
string(
"TDME2::Renderer::Graphics Renderer: ") +
renderer->
getRenderer());
792 GUIParser::initialize();
812 for (
auto i = 0; i <
lights.size(); i++) {
814 lights[i]->setSourceTexture(TextureReader::read(
"resources/engine/textures",
"sun.png"));
818 partition = make_unique<OctTreePartition>();
870 Console::println(
"TDME2::BC7 texture compression is available.");
872 Console::println(
"TDME2::BC7 texture compression is not available.");
877 Console::println(
"TDME2::Using shadow mapping");
884 Console::println(
"TDME2::Not using shadow mapping");
889 Console::println(
"TDME2::Using skinning compute shader");
893 Console::println(
"TDME2::Not using skinning compute shader");
896 #define CHECK_INITIALIZED(NAME, SHADER) if (SHADER != nullptr && SHADER->isInitialized() == false) Console::println(string("TDME: ") + NAME + ": Not initialized")
932 Console::println(
"TDME2::Using deferred shading");
934 Console::println(
"TDME2::Not using deferred shading");
938 Console::println(
string(
"TDME2::initialized & ready: ") + to_string(
initialized));
942 Console::println(
"Engine not initialized: Exiting!");
943 Application::exit(0);
949 Console::println(
"TDME2::PBR shaders are enabled");
950 Console::println(
"TDME2::Generating brdf LUT texture");
1041 reshape(this->width, this->height);
1059 decomposedEntites.
objects.clear();
1065 decomposedEntites.
opses.clear();
1066 decomposedEntites.
ppses.clear();
1067 decomposedEntites.
psgs.clear();
1088 for (
auto object: objects)
object->preRender(threadIdx);
1092 for (
auto object: objects)
object->computeAnimations(threadIdx);
1099 auto object =
static_cast<Object*
>(entity);
1100 if (object->isDisableDepthTest() ==
true) {
1106 if (object->isRequiringForwardShading() ==
true &&
1114 decomposedEntities.
objects.push_back(
object);
1120 auto lodObject =
static_cast<LODObject*
>(entity);
1121 if (decomposeAllEntities ==
true) {
1123 auto lod2Object = lodObject->getLOD2Object();
1124 auto lod3Object = lodObject->getLOD3Object();
1129 auto object = lodObject->determineLODObject(
camera.get());
1130 if (
object !=
nullptr)
decomposeEntityType(
object, decomposedEntities, decomposeAllEntities);
1137 if (decomposeAllEntities ==
true) {
1138 for (
auto subEntity: imposterObject->getBillboardObjects())
decomposeEntityType(subEntity, decomposedEntities);
1147 if (decomposeAllEntities ==
true) {
1149 for (
auto subEntity: lodObjectImposter->getLOD2Object()->getBillboardObjects())
decomposeEntityType(subEntity, decomposedEntities);
1151 auto object = lodObjectImposter->determineLODObject(
camera.get());
1152 if (
object !=
nullptr)
decomposeEntityType(
object, decomposedEntities, decomposeAllEntities);
1159 if (decomposeAllEntities ==
true) {
1160 for (
auto object: opse->getObjects())
decomposeEntityType(
object, decomposedEntities, decomposeAllEntities);
1162 for (
auto object: opse->getEnabledObjects())
decomposeEntityType(
object, decomposedEntities, decomposeAllEntities);
1164 decomposedEntities.
opses.push_back(opse);
1170 decomposedEntities.
ppses.push_back(ppse);
1176 decomposedEntities.
ppses.push_back(fpse);
1181 auto l =
static_cast<Lines*
>(entity);
1187 auto d =
static_cast<Decal*
>(entity);
1201 auto subEntity = org->getEntity();
1202 if (subEntity !=
nullptr)
decomposeEntityType(subEntity, decomposedEntities, decomposeAllEntities);
1208 decomposedEntities.
psgs.push_back(psg); \
1209 for (
auto ps: psg->getParticleSystems())
decomposeEntityType(ps, decomposedEntities, decomposeAllEntities);
1216 for (
auto entityEh: eh->getEntities()) {
1217 if (entityEh->isEnabled() ==
false && decomposeAllEntities ==
false)
continue;
1228 for (
auto entity: entities) {
1236 if (autoEmit ==
true) {
1241 if (pse->isEnabled() ==
false)
continue;
1245 pse->updateParticles();
1258 auto parentEntity = entity->getParentEntity();
1259 if ((parentEntity !=
nullptr &&
partition->isVisibleEntity(parentEntity) ==
false) ||
1260 (parentEntity ==
nullptr &&
partition->isVisibleEntity(entity) ==
false))
continue;
1266 if (computeAnimations ==
true) {
1269 auto parentEntity = entity->getParentEntity();
1270 if ((parentEntity !=
nullptr &&
partition->isVisibleEntity(parentEntity) ==
false) ||
1271 (parentEntity ==
nullptr &&
partition->isVisibleEntity(entity) ==
false))
continue;
1280 if (entity->isEnabled() ==
false)
continue;
1299 auto elementsIssued = 0;
1302 queueElement->engine =
this;
1303 queueElement->animations.computeAnimations = computeAnimations;
1307 auto queueElementToSubmit = queueElement;
1310 queueElement->engine =
this;
1311 queueElement->animations.computeAnimations = computeAnimations;
1316 if (queueElement->objects.empty() ==
false) {
1322 queueElement->engine =
this;
1323 queueElement->animations.computeAnimations = computeAnimations;
1327 auto queueElementToSubmit = queueElement;
1330 queueElement->engine =
this;
1331 queueElement->animations.computeAnimations = computeAnimations;
1336 if (queueElement->objects.empty() ==
false) {
1339 queueElement =
nullptr;
1343 while (
true ==
true) {
1344 auto elementsProcessed = 0;
1345 for (
const auto& engineThread:
Engine::engineThreads) elementsProcessed+= engineThread->getProcessedElements();
1346 if (elementsProcessed == elementsIssued) {
1367 if (
actions.empty() ==
false) {
1368 vector<unique_ptr<Action>> currentActions;
1370 currentActions.push_back(move(action));
1373 for (
const auto& action: currentActions) {
1374 action->performAction();
1394 camera->getFrustum()->update();
1410 effectPassFrameBuffersInUse.fill(
false);
1413 auto program =
postProcessing->getPostProcessingProgram(programId);
1414 if (program ==
nullptr)
continue;
1415 for (
const auto& effectPass: program->getEffectPasses()) {
1416 auto effectPassIdx = effectPass.effectPassIdx;
1417 auto frameBufferIdx = effectPass.effectPassIdx - 1;
1418 auto frameBufferWidth = _width / effectPass.frameBufferWidthDivideFactor;
1419 auto frameBufferHeight = _height / effectPass.frameBufferHeightDivideFactor;
1428 effectPassFrameBuffersInUse[frameBufferIdx] =
true;
1433 effectPass.clearColor.getRed(),
1434 effectPass.clearColor.getGreen(),
1435 effectPass.clearColor.getBlue(),
1436 effectPass.clearColor.getAlpha()
1442 auto lightSourceVisible =
false;
1443 if (effectPass.renderLightSources ==
true) {
1448 if (effectPass.skipOnLightSourceNotVisible ==
true && lightSourceVisible ==
false) {
1459 effectPass.shaderPrefix,
1464 EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY |
1465 EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY |
1466 EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY,
1474 for (
auto i = 0; i < effectPassFrameBuffersInUse.size(); i++) {
1537 EntityRenderer::RENDERTYPE_NORMALS |
1538 EntityRenderer::RENDERTYPE_TEXTUREARRAYS |
1539 EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY |
1540 EntityRenderer::RENDERTYPE_EFFECTCOLORS |
1541 EntityRenderer::RENDERTYPE_MATERIALS |
1542 EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY |
1543 EntityRenderer::RENDERTYPE_TEXTURES |
1544 EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY |
1545 EntityRenderer::RENDERTYPE_LIGHTS,
1571 auto worldCoordinate4 =
camera->getModelViewProjectionInvertedMatrix().multiply(
1573 (2.0f * (mouseX * scaleFactorWidth) / _width) - 1.0f,
1574 1.0f - (2.0f * (mouseY * scaleFactorHeight) / _height),
1579 worldCoordinate4.scale(1.0f / worldCoordinate4.getW());
1581 worldCoordinate4.getX(),
1582 worldCoordinate4.getY(),
1583 worldCoordinate4.getZ()
1618 Vector3 boundingBoxLineContactMin;
1619 Vector3 boundingBoxLineContactMax;
1623 auto selectedEntityDistance = Float::MAX_VALUE;
1624 Entity* selectedEntity =
nullptr;
1625 Node* selectedObjectNode =
nullptr;
1629 if (decomposedEntities.
objectsGizmo.empty() ==
false) {
1637 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
1638 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
1640 for (
auto it = entity->getTransformedFacesIterator()->iterator(); it->hasNext();) {
1641 const auto& vertices = it->next();
1642 if (LineSegment::doesLineSegmentCollideWithTriangle(vertices[0], vertices[1], vertices[2], nearPlaneWorldCoordinate, farPlaneWorldCoordinate, lineTriangleContact) ==
true) {
1645 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
1646 selectedEntity = entity;
1647 selectedEntityDistance = entityDistance;
1648 selectedObjectNode = it->getNode();
1649 selectedParticleSystem =
nullptr;
1656 if (selectedEntity !=
nullptr) {
1657 if (objectNode !=
nullptr) *objectNode = selectedObjectNode;
1658 for (
auto _entity = selectedEntity; _entity !=
nullptr; _entity = _entity->
getParentEntity()) {
1659 if (_entity->getParentEntity() ==
nullptr) {
1674 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
1675 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
1677 if (LineSegment::doesBoundingBoxCollideWithLineSegment(entity->getWorldBoundingBox(), nearPlaneWorldCoordinate, farPlaneWorldCoordinate, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
1678 auto entityDistance = lineTriangleContact.
set(entity->getWorldBoundingBox()->getCenter()).
sub(nearPlaneWorldCoordinate).
computeLengthSquared();
1680 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
1681 selectedEntity = entity;
1682 selectedEntityDistance = entityDistance;
1683 selectedObjectNode =
nullptr;
1684 selectedParticleSystem =
nullptr;
1690 if (selectedEntity !=
nullptr) {
1691 if (objectNode !=
nullptr) *objectNode = selectedObjectNode;
1692 for (
auto _entity = selectedEntity; _entity !=
nullptr; _entity = _entity->
getParentEntity()) {
1693 if (_entity->getParentEntity() ==
nullptr)
return _entity;
1701 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
1702 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
1704 if (LineSegment::doesBoundingBoxCollideWithLineSegment(entity->getWorldBoundingBox(), nearPlaneWorldCoordinate, farPlaneWorldCoordinate, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
1705 for (
auto it = entity->getTransformedFacesIterator()->iterator(); it->hasNext();) {
1706 const auto& vertices = it->next();
1707 if (LineSegment::doesLineSegmentCollideWithTriangle(vertices[0], vertices[1], vertices[2], nearPlaneWorldCoordinate, farPlaneWorldCoordinate, lineTriangleContact) ==
true) {
1710 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
1711 selectedEntity = entity;
1712 selectedEntityDistance = entityDistance;
1713 selectedObjectNode = it->getNode();
1714 selectedParticleSystem =
nullptr;
1722 if (selectedEntity !=
nullptr) {
1723 if (objectNode !=
nullptr) *objectNode = selectedObjectNode;
1724 for (
auto _entity = selectedEntity; _entity !=
nullptr; _entity = _entity->
getParentEntity()) {
1725 if (_entity->getParentEntity() ==
nullptr)
return _entity;
1731 for (
auto entity: decomposedEntities.
opses) {
1733 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
1734 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
1736 if (LineSegment::doesBoundingBoxCollideWithLineSegment(entity->getWorldBoundingBox(), nearPlaneWorldCoordinate, farPlaneWorldCoordinate, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
1737 auto entityDistance = lineTriangleContact.
set(entity->getWorldBoundingBox()->getCenter()).
sub(nearPlaneWorldCoordinate).
computeLengthSquared();
1739 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
1740 selectedEntity = entity;
1741 selectedEntityDistance = entityDistance;
1742 selectedObjectNode =
nullptr;
1743 selectedParticleSystem =
nullptr;
1749 for (
auto entity: decomposedEntities.
ppses) {
1751 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
1752 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
1754 if (LineSegment::doesBoundingBoxCollideWithLineSegment(entity->getWorldBoundingBox(), nearPlaneWorldCoordinate, farPlaneWorldCoordinate, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
1755 auto entityDistance = lineTriangleContact.
set(entity->getWorldBoundingBox()->getCenter()).
sub(nearPlaneWorldCoordinate).
computeLengthSquared();
1757 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
1758 selectedEntity = entity;
1759 selectedEntityDistance = entityDistance;
1760 selectedObjectNode =
nullptr;
1761 selectedParticleSystem =
nullptr;
1767 for (
auto entity: decomposedEntities.
psgs) {
1769 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
1770 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
1772 if (LineSegment::doesBoundingBoxCollideWithLineSegment(entity->getWorldBoundingBox(), nearPlaneWorldCoordinate, farPlaneWorldCoordinate, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
1773 auto entityDistance = lineTriangleContact.
set(entity->getWorldBoundingBox()->getCenter()).
sub(nearPlaneWorldCoordinate).
computeLengthSquared();
1775 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
1776 selectedEntity = entity;
1777 selectedEntityDistance = entityDistance;
1778 selectedObjectNode =
nullptr;
1779 selectedParticleSystem =
nullptr;
1780 auto selectedSubEntityDistance = Float::MAX_VALUE;
1782 for (
auto subEntity: entity->getParticleSystems()) {
1783 if (LineSegment::doesBoundingBoxCollideWithLineSegment(subEntity->getWorldBoundingBox(), nearPlaneWorldCoordinate, farPlaneWorldCoordinate, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
1784 auto subEntityDistance = lineTriangleContact.
set(subEntity->getWorldBoundingBox()->getCenter()).
sub(nearPlaneWorldCoordinate).
computeLengthSquared();
1786 if (selectedParticleSystem ==
nullptr || subEntityDistance < selectedSubEntityDistance) {
1787 selectedSubEntityDistance = subEntityDistance;
1788 selectedParticleSystem = subEntity;
1799 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
1800 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
1802 if (LineSegment::doesBoundingBoxCollideWithLineSegment(entity->getWorldBoundingBox(), nearPlaneWorldCoordinate, farPlaneWorldCoordinate, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
1803 auto entityDistance = lineTriangleContact.
set(entity->getWorldBoundingBox()->getCenter()).
sub(nearPlaneWorldCoordinate).
computeLengthSquared();
1805 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
1806 selectedEntity = entity;
1807 selectedEntityDistance = entityDistance;
1808 selectedObjectNode =
nullptr;
1809 selectedParticleSystem =
nullptr;
1816 for (
auto& objects: objectsArray) {
1817 for (
auto entity: *objects) {
1819 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
1820 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
1822 if (LineSegment::doesBoundingBoxCollideWithLineSegment(entity->getWorldBoundingBox(), nearPlaneWorldCoordinate, farPlaneWorldCoordinate, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
1823 for (
auto it = entity->getTransformedFacesIterator()->iterator(); it->hasNext();) {
1824 const auto& vertices = it->next();
1825 if (LineSegment::doesLineSegmentCollideWithTriangle(vertices[0], vertices[1], vertices[2], nearPlaneWorldCoordinate, farPlaneWorldCoordinate, lineTriangleContact) ==
true) {
1828 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
1829 selectedEntity = entity;
1830 selectedEntityDistance = entityDistance;
1831 selectedObjectNode = it->getNode();
1832 selectedParticleSystem =
nullptr;
1841 for (
auto entity: decomposedEntities.
lodObjects) {
1843 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
1844 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
1846 if (LineSegment::doesBoundingBoxCollideWithLineSegment(entity->getWorldBoundingBox(), nearPlaneWorldCoordinate, farPlaneWorldCoordinate, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
1847 auto object = entity->getLODObject();
1848 if (
object !=
nullptr) {
1849 for (
auto it = object->getTransformedFacesIterator()->iterator(); it->hasNext();) {
1850 const auto& vertices = it->next();
1851 if (LineSegment::doesLineSegmentCollideWithTriangle(vertices[0], vertices[1], vertices[2], nearPlaneWorldCoordinate, farPlaneWorldCoordinate, lineTriangleContact) ==
true) {
1854 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
1855 selectedEntity = entity;
1856 selectedEntityDistance = entityDistance;
1859 selectedObjectNode = it->getNode();
1860 selectedParticleSystem =
nullptr;
1869 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
1870 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
1872 if (LineSegment::doesBoundingBoxCollideWithLineSegment(entity->getWorldBoundingBox(), nearPlaneWorldCoordinate, farPlaneWorldCoordinate, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
1874 Node* objectNodeEH =
nullptr;
1877 entity->getEntities(),
1878 decomposedEntitiesEH
1881 decomposedEntitiesEH,
1887 &particleSystemEntityEH
1889 if (subEntity !=
nullptr) {
1890 auto entityDistance = lineTriangleContact.
set(subEntity->getWorldBoundingBox()->getCenter()).
sub(nearPlaneWorldCoordinate).
computeLengthSquared();
1892 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
1893 selectedEntity = entity;
1894 selectedEntityDistance = entityDistance;
1895 selectedObjectNode = objectNodeEH;
1896 selectedParticleSystem = particleSystemEntityEH;
1903 if (objectNode !=
nullptr) *objectNode = selectedObjectNode;
1906 if (particleSystemEntity !=
nullptr) {
1907 *particleSystemEntity = selectedParticleSystem;
1911 if (selectedEntity !=
nullptr) {
1912 for (
auto _entity = selectedEntity; _entity !=
nullptr; _entity = _entity->
getParentEntity()) {
1913 if (_entity->getParentEntity() ==
nullptr)
return _entity;
1927 return doRayCasting(startPoint, endPoint, contactPoint, filter);
1937 Vector3 boundingBoxLineContactMin;
1938 Vector3 boundingBoxLineContactMax;
1942 auto selectedEntityDistance = Float::MAX_VALUE;
1943 Entity* selectedEntity =
nullptr;
1948 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
1949 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
1951 if (LineSegment::doesBoundingBoxCollideWithLineSegment(entity->getWorldBoundingBox(), startPoint, endPoint, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
1952 for (
auto it = entity->getTransformedFacesIterator()->iterator(); it->hasNext();) {
1953 const auto& vertices = it->next();
1954 if (LineSegment::doesLineSegmentCollideWithTriangle(vertices[0], vertices[1], vertices[2], startPoint, endPoint, lineTriangleContact) ==
true) {
1957 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
1958 selectedEntity = entity;
1959 selectedEntityDistance = entityDistance;
1960 contactPoint = lineTriangleContact;
1967 if (selectedEntity !=
nullptr) {
1968 return selectedEntity;
1973 for (
auto& objects: objectsArray) {
1974 for (
auto entity: *objects) {
1976 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
1977 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
1979 if (LineSegment::doesBoundingBoxCollideWithLineSegment(entity->getWorldBoundingBox(), startPoint, endPoint, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
1980 for (
auto it = entity->getTransformedFacesIterator()->iterator(); it->hasNext();) {
1981 const auto& vertices = it->next();
1982 if (LineSegment::doesLineSegmentCollideWithTriangle(vertices[0], vertices[1], vertices[2], startPoint, endPoint, lineTriangleContact) ==
true) {
1985 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
1986 selectedEntity = entity;
1987 selectedEntityDistance = entityDistance;
1988 contactPoint = lineTriangleContact;
1997 for (
auto entity: decomposedEntities.
lodObjects) {
1999 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
2000 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
2002 if (LineSegment::doesBoundingBoxCollideWithLineSegment(entity->getWorldBoundingBox(), startPoint, endPoint, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
2003 auto object = entity->getLODObject();
2004 if (
object !=
nullptr) {
2005 for (
auto it = object->getTransformedFacesIterator()->iterator(); it->hasNext();) {
2006 const auto& vertices = it->next();
2007 if (LineSegment::doesLineSegmentCollideWithTriangle(vertices[0], vertices[1], vertices[2], startPoint, endPoint, lineTriangleContact) ==
true) {
2010 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
2011 selectedEntity = entity;
2012 selectedEntityDistance = entityDistance;
2013 contactPoint = lineTriangleContact;
2024 if (forcePicking ==
false && entity->isPickable() ==
false)
continue;
2025 if (filter !=
nullptr && filter->
filterEntity(entity) ==
false)
continue;
2027 if (LineSegment::doesBoundingBoxCollideWithLineSegment(entity->getWorldBoundingBox(), startPoint, endPoint, boundingBoxLineContactMin, boundingBoxLineContactMax) ==
true) {
2030 entity->getEntities(),
2031 decomposedEntitiesEH
2035 decomposedEntitiesEH,
2042 if (entity !=
nullptr) {
2045 if (selectedEntity ==
nullptr || entityDistance < selectedEntityDistance) {
2046 selectedEntity = entity;
2047 selectedEntityDistance = entityDistance;
2048 contactPoint = contactPointEH;
2055 return selectedEntity;
2063 auto screenCoordinate4 =
camera->getModelViewProjectionMatrix().multiply(
Vector4(worldCoordinate, 1.0f));
2064 screenCoordinate4.scale(1.0f / screenCoordinate4.getW());
2066 screenCoordinate.
setX((screenCoordinate4[0] + 1.0f) * _width / 2.0f);
2067 screenCoordinate.
setY(_height - ((screenCoordinate4[1] + 1.0f) * _height / 2.0f));
2068 return camera->getCameraMatrix().multiply(worldCoordinate).getZ() <= 0.0f;
2077 vector<string> entitiesToRemove;
2079 entitiesToRemove.push_back(entityId);
2081 for (
const auto& entityKey: entitiesToRemove) {
2095 for (
const auto& effectPassFrameBuffer:
effectPassFrameBuffers)
if (effectPassFrameBuffer !=
nullptr) effectPassFrameBuffer->dispose();
2098 for (
const auto& light:
lights) light->dispose();
2104 GUIParser::dispose();
2114 for (
const auto& engineThread:
engineThreads) engineThread->stop();
2115 for (
const auto& engineThread:
engineThreads) engineThread->join();
2123 ObjectBuffer::dispose();
2158 if (pixels ==
nullptr) {
2159 Console::println(
"Engine::makeScreenshot(): Failed to read pixels");
2170 "tdme.engine.makescreenshot",
2182 PNGTextureWriter::write(texture.get(), pathName, fileName, removeAlphaChannel);
2198 if (pixels ==
nullptr) {
2199 Console::println(
"Engine::makeScreenshot(): Failed to read pixels");
2210 "tdme.engine.makescreenshot",
2222 PNGTextureWriter::write(texture.get(), pngData);
2241 auto postProcessingFrameBufferIdx = 0;
2243 auto program =
postProcessing->getPostProcessingProgram(programId);
2244 if (program ==
nullptr)
continue;
2245 if (program->getRenderPass() != renderPass)
continue;
2246 auto effectPassSkipDetected =
false;
2247 for (
const auto& effectPass: program->getEffectPasses()) {
2248 if (
effectPassSkip[effectPass.effectPassIdx - 1] ==
true) effectPassSkipDetected =
true;
2250 if (effectPassSkipDetected ==
true)
continue;
2251 for (
const auto& step: program->getPostProcessingSteps()) {
2252 auto shaderId = step.shaderId;
2256 if (step.blendToSource == PostProcessingProgram::FRAMEBUFFERSOURCE_SCREEN) {
2257 blendToSource = postProcessingFrameBuffers[postProcessingFrameBufferIdx];
2259 switch(step.source) {
2260 case PostProcessingProgram::FRAMEBUFFERSOURCE_NONE:
2262 case PostProcessingProgram::FRAMEBUFFERSOURCE_SCREEN:
2263 source = postProcessingFrameBuffers[postProcessingFrameBufferIdx];
2266 source =
effectPassFrameBuffers[step.source - PostProcessingProgram::FRAMEBUFFERSOURCE_EFFECTPASS0].get();
2269 switch(step.target) {
2270 case PostProcessingProgram::FRAMEBUFFERTARGET_SCREEN:
2271 target = postProcessingFrameBuffers[(postProcessingFrameBufferIdx + 1) % 2];
2273 case PostProcessingProgram::FRAMEBUFFERTARGET_TEMPORARY:
2283 switch(step.target) {
2284 case PostProcessingProgram::FRAMEBUFFERTARGET_SCREEN:
2285 postProcessingFrameBufferIdx = (postProcessingFrameBufferIdx + 1) % 2;
2287 case PostProcessingProgram::FRAMEBUFFERTARGET_TEMPORARY:
2294 if (postProcessingFrameBuffers[postProcessingFrameBufferIdx] != targetFrameBuffer) {
2295 if (targetFrameBuffer !=
nullptr) {
2300 postProcessingFrameBuffers[postProcessingFrameBufferIdx]->renderToScreen(
this);
2304 void Engine::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) {
2317 if ((renderPassMask & renderPass) == renderPass) {
2319 if (renderGeometryBuffer !=
nullptr) {
2333 ((renderTypes & EntityRenderer::RENDERTYPE_NORMALS) == EntityRenderer::RENDERTYPE_NORMALS?EntityRenderer::RENDERTYPE_NORMALS:0) |
2334 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTUREARRAYS) == EntityRenderer::RENDERTYPE_TEXTUREARRAYS?EntityRenderer::RENDERTYPE_TEXTUREARRAYS:0) |
2335 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY:0) |
2336 ((renderTypes & EntityRenderer::RENDERTYPE_EFFECTCOLORS) == EntityRenderer::RENDERTYPE_EFFECTCOLORS?EntityRenderer::RENDERTYPE_EFFECTCOLORS:0) |
2337 ((renderTypes & EntityRenderer::RENDERTYPE_MATERIALS) == EntityRenderer::RENDERTYPE_MATERIALS?EntityRenderer::RENDERTYPE_MATERIALS:0) |
2338 ((renderTypes & EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY:0) |
2339 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTURES) == EntityRenderer::RENDERTYPE_TEXTURES?EntityRenderer::RENDERTYPE_TEXTURES:0) |
2340 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY:0)|
2341 ((renderTypes & EntityRenderer::RENDERTYPE_LIGHTS) == EntityRenderer::RENDERTYPE_LIGHTS?EntityRenderer::RENDERTYPE_LIGHTS:0)
2344 if (renderGeometryBuffer !=
nullptr) {
2367 ((renderTypes & EntityRenderer::RENDERTYPE_NORMALS) == EntityRenderer::RENDERTYPE_NORMALS?EntityRenderer::RENDERTYPE_NORMALS:0) |
2368 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTUREARRAYS) == EntityRenderer::RENDERTYPE_TEXTUREARRAYS?EntityRenderer::RENDERTYPE_TEXTUREARRAYS:0) |
2369 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY:0) |
2370 ((renderTypes & EntityRenderer::RENDERTYPE_EFFECTCOLORS) == EntityRenderer::RENDERTYPE_EFFECTCOLORS?EntityRenderer::RENDERTYPE_EFFECTCOLORS:0) |
2371 ((renderTypes & EntityRenderer::RENDERTYPE_MATERIALS) == EntityRenderer::RENDERTYPE_MATERIALS?EntityRenderer::RENDERTYPE_MATERIALS:0) |
2372 ((renderTypes & EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY:0) |
2373 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTURES) == EntityRenderer::RENDERTYPE_TEXTURES?EntityRenderer::RENDERTYPE_TEXTURES:0) |
2374 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY:0)|
2375 ((renderTypes & EntityRenderer::RENDERTYPE_LIGHTS) == EntityRenderer::RENDERTYPE_LIGHTS?EntityRenderer::RENDERTYPE_LIGHTS:0)
2382 ((renderTypes & EntityRenderer::RENDERTYPE_NORMALS) == EntityRenderer::RENDERTYPE_NORMALS?EntityRenderer::RENDERTYPE_NORMALS:0) |
2383 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTUREARRAYS) == EntityRenderer::RENDERTYPE_TEXTUREARRAYS?EntityRenderer::RENDERTYPE_TEXTUREARRAYS:0) |
2384 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY:0) |
2385 ((renderTypes & EntityRenderer::RENDERTYPE_EFFECTCOLORS) == EntityRenderer::RENDERTYPE_EFFECTCOLORS?EntityRenderer::RENDERTYPE_EFFECTCOLORS:0) |
2386 ((renderTypes & EntityRenderer::RENDERTYPE_MATERIALS) == EntityRenderer::RENDERTYPE_MATERIALS?EntityRenderer::RENDERTYPE_MATERIALS:0) |
2387 ((renderTypes & EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY:0) |
2388 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTURES) == EntityRenderer::RENDERTYPE_TEXTURES?EntityRenderer::RENDERTYPE_TEXTURES:0) |
2389 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY:0)|
2390 ((renderTypes & EntityRenderer::RENDERTYPE_LIGHTS) == EntityRenderer::RENDERTYPE_LIGHTS?EntityRenderer::RENDERTYPE_LIGHTS:0)
2406 if (applyShadowMapping ==
true &&
shadowMapping !=
nullptr) {
2413 if (applyPostProcessing ==
true) {
2454 if (applyPostProcessing ==
true) {
2470 if ((renderPassMask & renderPass) == renderPass) {
2476 ((renderTypes & EntityRenderer::RENDERTYPE_NORMALS) == EntityRenderer::RENDERTYPE_NORMALS?EntityRenderer::RENDERTYPE_NORMALS:0) |
2477 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTUREARRAYS) == EntityRenderer::RENDERTYPE_TEXTUREARRAYS?EntityRenderer::RENDERTYPE_TEXTUREARRAYS:0) |
2478 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY:0) |
2479 ((renderTypes & EntityRenderer::RENDERTYPE_EFFECTCOLORS) == EntityRenderer::RENDERTYPE_EFFECTCOLORS?EntityRenderer::RENDERTYPE_EFFECTCOLORS:0) |
2480 ((renderTypes & EntityRenderer::RENDERTYPE_MATERIALS) == EntityRenderer::RENDERTYPE_MATERIALS?EntityRenderer::RENDERTYPE_MATERIALS:0) |
2481 ((renderTypes & EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY:0) |
2482 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTURES) == EntityRenderer::RENDERTYPE_TEXTURES?EntityRenderer::RENDERTYPE_TEXTURES:0) |
2483 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY:0)|
2484 ((renderTypes & EntityRenderer::RENDERTYPE_LIGHTS) == EntityRenderer::RENDERTYPE_LIGHTS?EntityRenderer::RENDERTYPE_LIGHTS:0)
2497 if (applyShadowMapping ==
true &&
shadowMapping !=
nullptr) {
2515 if ((renderPassMask & renderPass) == renderPass) {
2521 ((renderTypes & EntityRenderer::RENDERTYPE_NORMALS) == EntityRenderer::RENDERTYPE_NORMALS?EntityRenderer::RENDERTYPE_NORMALS:0) |
2522 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTUREARRAYS) == EntityRenderer::RENDERTYPE_TEXTUREARRAYS?EntityRenderer::RENDERTYPE_TEXTUREARRAYS:0) |
2523 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY:0) |
2524 ((renderTypes & EntityRenderer::RENDERTYPE_EFFECTCOLORS) == EntityRenderer::RENDERTYPE_EFFECTCOLORS?EntityRenderer::RENDERTYPE_EFFECTCOLORS:0) |
2525 ((renderTypes & EntityRenderer::RENDERTYPE_MATERIALS) == EntityRenderer::RENDERTYPE_MATERIALS?EntityRenderer::RENDERTYPE_MATERIALS:0) |
2526 ((renderTypes & EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY:0) |
2527 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTURES) == EntityRenderer::RENDERTYPE_TEXTURES?EntityRenderer::RENDERTYPE_TEXTURES:0) |
2528 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY:0)|
2529 ((renderTypes & EntityRenderer::RENDERTYPE_LIGHTS) == EntityRenderer::RENDERTYPE_LIGHTS?EntityRenderer::RENDERTYPE_LIGHTS:0)
2545 if (applyShadowMapping ==
true &&
shadowMapping !=
nullptr) {
2583 ((renderTypes & EntityRenderer::RENDERTYPE_NORMALS) == EntityRenderer::RENDERTYPE_NORMALS?EntityRenderer::RENDERTYPE_NORMALS:0) |
2584 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTUREARRAYS) == EntityRenderer::RENDERTYPE_TEXTUREARRAYS?EntityRenderer::RENDERTYPE_TEXTUREARRAYS:0) |
2585 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY:0) |
2586 ((renderTypes & EntityRenderer::RENDERTYPE_EFFECTCOLORS) == EntityRenderer::RENDERTYPE_EFFECTCOLORS?EntityRenderer::RENDERTYPE_EFFECTCOLORS:0) |
2587 ((renderTypes & EntityRenderer::RENDERTYPE_MATERIALS) == EntityRenderer::RENDERTYPE_MATERIALS?EntityRenderer::RENDERTYPE_MATERIALS:0) |
2588 ((renderTypes & EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY:0) |
2589 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTURES) == EntityRenderer::RENDERTYPE_TEXTURES?EntityRenderer::RENDERTYPE_TEXTURES:0) |
2590 ((renderTypes & EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY) == EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY?EntityRenderer::RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY:0)|
2591 ((renderTypes & EntityRenderer::RENDERTYPE_LIGHTS) == EntityRenderer::RENDERTYPE_LIGHTS?EntityRenderer::RENDERTYPE_LIGHTS:0)
2598 if (renderFrameBuffer !=
nullptr) {
2612 if (doRenderLightSource ==
true) {
2625 auto lightSourceVisible =
false;
2626 for (
const auto& light:
lights) {
2627 if (light->isEnabled() ==
false || light->isRenderSource() ==
false)
continue;
2628 auto lightSourceSize = light->getSourceSize();
2629 auto lightSourcePixelSize = width < height?static_cast<float>(lightSourceSize) *
static_cast<float>(
width):
static_cast<float>(lightSourceSize) *
static_cast<float>(
height);;
2630 Vector2 lightSourceDimension2D =
Vector2(lightSourcePixelSize, lightSourcePixelSize);
2631 Vector2 lightSourcePosition2D;
2632 Vector3 lightSourcePosition =
Vector3(light->getPosition().getX(), light->getPosition().getY(), light->getPosition().getZ());
2633 if (light->getPosition().getW() > Math::EPSILON) lightSourcePosition.
scale(1.0f / light->getPosition().getW());
2635 lightSourcePosition2D.
sub(lightSourceDimension2D.
clone().
scale(0.5f));
2636 if (visible ==
true) {
2638 lightSourceVisible =
true;
2641 return lightSourceVisible;
2645 for (
auto shaderType = 0; shaderType <
SHADERTYPE_MAX; shaderType++)
2647 string shaderTypeString =
"unknown";
2648 switch (shaderType) {
2654 Console::println(
string(
"TDME2::registered " + shaderTypeString +
" shader: ") + shaderId);
2656 if (shaderParametersDefaults ==
nullptr)
continue;
2657 if (shaderParametersDefaults->size() > 0) {
2659 for (
const auto parameterDefaults: *shaderParametersDefaults) {
2660 const auto& parameterName = parameterDefaults.name;
2661 Console::print(
"\t" + parameterName);
2662 switch(parameterDefaults.value.getType()) {
2664 Console::print(
" = none");
2667 Console::print(
" = boolean(");
2668 Console::print(
"value = " +
string(
getShaderParameter(shaderId, parameterName).getBooleanValue() ==
true?
"true":
"false"));
2669 Console::print(
")");
2672 Console::print(
" = integer(");
2673 Console::print(
"value = " + to_string(
getShaderParameter(shaderId, parameterName).getIntegerValue()) +
", ");
2674 Console::print(
"min = " + to_string(parameterDefaults.min.getIntegerValue()) +
", ");
2675 Console::print(
"max = " + to_string(parameterDefaults.max.getIntegerValue()) +
", ");
2676 Console::print(
"step = " + to_string(parameterDefaults.step.getIntegerValue()));
2677 Console::print(
")");
2680 Console::print(
" = float(");
2681 Console::print(
"value = " + to_string(
getShaderParameter(shaderId, parameterName).getFloatValue()) +
", ");
2682 Console::print(
"min = " + to_string(parameterDefaults.min.getFloatValue()) +
", ");
2683 Console::print(
"max = " + to_string(parameterDefaults.max.getFloatValue()) +
", ");
2684 Console::print(
"step = " + to_string(parameterDefaults.step.getFloatValue()));
2685 Console::print(
")");
2689 Console::print(
" = Vector2(");
2691 Console::print(
"value = ");
2693 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2694 if (i != 0) Console::print(
",");
2695 Console::print(to_string(shaderParameterArray[i]));
2699 Console::print(
", min = ");
2700 const auto shaderParameterArray = parameterDefaults.min.getVector2ValueArray();
2701 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2702 if (i != 0) Console::print(
",");
2703 Console::print(to_string(shaderParameterArray[i]));
2707 Console::print(
", max = ");
2708 const auto shaderParameterArray = parameterDefaults.max.getVector2ValueArray();
2709 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2710 if (i != 0) Console::print(
",");
2711 Console::print(to_string(shaderParameterArray[i]));
2715 Console::print(
", step = ");
2716 const auto shaderParameterArray = parameterDefaults.step.getVector2ValueArray();
2717 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2718 if (i != 0) Console::print(
",");
2719 Console::print(to_string(shaderParameterArray[i]));
2722 Console::print(
")");
2727 Console::print(
" = Vector3(");
2729 Console::print(
"value = ");
2731 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2732 if (i != 0) Console::print(
",");
2733 Console::print(to_string(shaderParameterArray[i]));
2737 Console::print(
", min = ");
2738 const auto shaderParameterArray = parameterDefaults.min.getVector3ValueArray();
2739 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2740 if (i != 0) Console::print(
",");
2741 Console::print(to_string(shaderParameterArray[i]));
2745 Console::print(
", max = ");
2746 const auto shaderParameterArray = parameterDefaults.max.getVector3ValueArray();
2747 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2748 if (i != 0) Console::print(
",");
2749 Console::print(to_string(shaderParameterArray[i]));
2753 Console::print(
", step = ");
2754 const auto shaderParameterArray = parameterDefaults.step.getVector3ValueArray();
2755 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2756 if (i != 0) Console::print(
",");
2757 Console::print(to_string(shaderParameterArray[i]));
2760 Console::print(
")");
2765 Console::print(
" = Vector4(");
2767 Console::print(
"value = ");
2769 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2770 if (i != 0) Console::print(
",");
2771 Console::print(to_string(shaderParameterArray[i]));
2775 Console::print(
", min = ");
2776 const auto shaderParameterArray = parameterDefaults.min.getVector4ValueArray();
2777 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2778 if (i != 0) Console::print(
",");
2779 Console::print(to_string(shaderParameterArray[i]));
2783 Console::print(
", max = ");
2784 const auto shaderParameterArray = parameterDefaults.max.getVector4ValueArray();
2785 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2786 if (i != 0) Console::print(
",");
2787 Console::print(to_string(shaderParameterArray[i]));
2791 Console::print(
", step = ");
2792 const auto shaderParameterArray = parameterDefaults.step.getVector4ValueArray();
2793 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2794 if (i != 0) Console::print(
",");
2795 Console::print(to_string(shaderParameterArray[i]));
2798 Console::print(
")");
2803 Console::print(
" = Color4(");
2805 Console::print(
"value = ");
2807 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2808 if (i != 0) Console::print(
",");
2809 Console::print(to_string(shaderParameterArray[i]));
2813 Console::print(
", min = ");
2814 const auto shaderParameterArray = parameterDefaults.min.getColor4ValueArray();
2815 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2816 if (i != 0) Console::print(
",");
2817 Console::print(to_string(shaderParameterArray[i]));
2821 Console::print(
", max = ");
2822 const auto shaderParameterArray = parameterDefaults.max.getColor4ValueArray();
2823 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2824 if (i != 0) Console::print(
",");
2825 Console::print(to_string(shaderParameterArray[i]));
2829 Console::print(
", step = ");
2830 const auto shaderParameterArray = parameterDefaults.step.getColor4ValueArray();
2831 for (
auto i = 0; i < shaderParameterArray.size(); i++) {
2832 if (i != 0) Console::print(
",");
2833 Console::print(to_string(shaderParameterArray[i]));
2836 Console::print(
")");
2840 Console::print(
" = unknown");
2851 for (
auto subEntity: entityHierarchy->
query(parentNodeId)) {
2852 for (
auto i = 0; i < indent; i++) Console::print(
"\t");
2854 switch (subEntity->getEntityType()) {
2856 entityType =
"Decal";
2859 entityType =
"Entity Hierarchy";
2862 entityType =
"Environment Mapping";
2865 entityType =
"Imposter Object";
2868 entityType =
"Lines";
2871 entityType =
"LOD Object";
2874 entityType =
"LOD Object Imposter";
2877 entityType =
"Object";
2880 entityType =
"Object Render Group";
2883 entityType =
"Fog Particle System";
2886 entityType =
"Object Particle System";
2889 entityType =
"Particle System Group";
2892 entityType =
"Points Particle System";
2895 Console::println(
"\t" + subEntity->getId() +
" (" + entityType +
")");
2905 Console::println(
"Engine::dumpEntities()");
2907 Console::println(
"Engine Entities:");
2910 switch (entity->getEntityType()) {
2912 entityType =
"Decal";
2915 entityType =
"Entity Hierarchy";
2918 entityType =
"Environment Mapping";
2921 entityType =
"Imposter Object";
2924 entityType =
"Lines";
2927 entityType =
"LOD Object";
2930 entityType =
"LOD Object Imposter";
2933 entityType =
"Object";
2936 entityType =
"Object Render Group";
2939 entityType =
"Fog Particle System";
2942 entityType =
"Object Particle System";
2945 entityType =
"Particle System Group";
2948 entityType =
"Points Particle System";
2951 Console::println(
"\t" + entity->getId() +
" (" + entityType +
")");
#define CHECK_INITIALIZED(NAME, SHADER)
Application base class, please make sure to allocate application on heap to have correct application ...
void update(int contextIdx, int32_t width, int32_t height)
Sets up camera while resizing the view port.
const Vector3 & getLookFrom() const
@ FRUSTUMMODE_ORTHOGRAPHIC
Color 4 definition class.
void set(float r, float g, float b, float a)
Sets this color by its components.
Decal entity to be used with engine class.
unique_ptr< TransparentRenderFacesPool > transparentRenderFacesPool
static void setShadowMapRenderLookUps(int32_t shadowMapRenderLookUps)
Set shadowmap look ups for each pixel when rendering.
static STATIC_DLL_IMPEXT Engine * currentEngine
static STATIC_DLL_IMPEXT unique_ptr< PostProcessingShader > postProcessingShader
bool renderLightSources(int width, int height)
Render light sources.
unique_ptr< FrameBuffer > frameBuffer
void dumpShaders()
Print registered shaders and it default parameters to console.
bool removeEntity(const string &id)
Removes an entity.
array< unique_ptr< FrameBuffer >, EFFECTPASS_COUNT - 1 > effectPassFrameBuffers
static STATIC_DLL_IMPEXT unique_ptr< GUIShader > guiShader
static STATIC_DLL_IMPEXT Renderer * renderer
static STATIC_DLL_IMPEXT unique_ptr< DeferredLightingRenderShader > deferredLightingRenderShader
unique_ptr< Partition > partition
void initRendering()
Initiates the rendering process updates timing, updates camera.
void doPostProcessing(PostProcessingProgram::RenderPass renderPass, const array< FrameBuffer *, 2 > postProcessingFrameBuffers, FrameBuffer *targetFrameBuffer)
Do post processing.
TextureAtlas decalsTextureAtlas
vector< unique_ptr< Action > > actions
void reshape(int32_t width, int32_t height)
Reshape.
void display()
Renders the scene.
static STATIC_DLL_IMPEXT unique_ptr< LinesShader > linesShader
TextureAtlas ppsTextureAtlas
void preRenderFunction(vector< Object * > &objects, int threadIdx)
Update vertex buffers and such before rendering.
unique_ptr< FrameBuffer > postProcessingFrameBuffer2
static STATIC_DLL_IMPEXT unique_ptr< GUIRenderer > guiRenderer
void initialize()
Initialize render engine.
bool makeScreenshot(const string &pathName, const string &fileName, bool removeAlphaChannel=true)
Creates a PNG file from current screen( This does not seem to work with GLES2 and offscreen engines.
static STATIC_DLL_IMPEXT int threadCount
Vector3 computeGizmoCoordinateByMousePosition(int32_t mouseX, int32_t mouseY, float z)
Compute gizmo coordinate from mouse position and z value.
unique_ptr< FrameBuffer > postProcessingTemporaryFrameBuffer
static STATIC_DLL_IMPEXT bool skinningShaderEnabled
unordered_set< Entity * > noFrustumCullingEntities
void decomposeEntityTypes(const vector< Entity * > &entities, DecomposedEntities &decomposedEntities, bool decomposeAllEntities=false)
Decompose entity types.
Vector3 computeWorldCoordinateByMousePosition(int32_t mouseX, int32_t mouseY, float z)
Compute world coordinate from mouse position and z value.
void setPartition(Partition *partition)
Set partition.
static constexpr int UNIQUEMODELID_NONE
unique_ptr< Camera > gizmoCamera
void addPostProcessingProgram(const string &programId)
Add post processing program.
static STATIC_DLL_IMPEXT AnimationProcessingTarget animationProcessingTarget
void doneGUIMode()
Set up GUI mode rendering.
Entity * doRayCasting(const Vector3 &startPoint, const Vector3 &endPoint, Vector3 &contactPoint, EntityPickingFilter *filter=nullptr)
Does a ray casting of visible 3d object based entities.
unique_ptr< EntityRenderer > entityRenderer
void initGUIMode()
Set up GUI mode rendering.
static STATIC_DLL_IMPEXT unique_ptr< LightingShader > lightingShader
void decomposeEntityType(Entity *entity, DecomposedEntities &decomposedEntities, bool decomposeAllEntities=false)
Decompose entity type.
@ SHADERTYPE_POSTPROCESSING
void computeAnimationsFunction(vector< Object * > &objects, int threadIdx)
Computes animations.
static STATIC_DLL_IMPEXT unique_ptr< BRDFLUTShader > brdfLUTShader
unique_ptr< FrameBuffer > postProcessingFrameBuffer1
void removeFromDecomposedEntities(DecomposedEntities &decomposedEntities, Entity *entity)
Remove entity from decomposed entities.
static STATIC_DLL_IMPEXT unique_ptr< ParticlesShader > particlesShader
void deregisterModel(Model *model)
Deregister model.
static Renderer * getRenderer()
static Engine * createOffScreenInstance(int32_t width, int32_t height, bool enableShadowMapping, bool enableDepthBuffer, bool enableGeometryBuffer)
Creates an offscreen rendering instance Note:
static void shutdown()
Shuts down main engine.
vector< int > freeObjectUniqueModelIdIds
static STATIC_DLL_IMPEXT unique_ptr< ShadowMapRenderShader > shadowMappingShaderRender
void scale(int32_t width, int32_t height)
Scale which applies to main engine only.
static constexpr int ENGINETHREADSQUEUE_COMPUTE_DISPATCH_COUNT
static STATIC_DLL_IMPEXT unique_ptr< ShadowMapCreationShader > shadowMappingShaderPre
bool shadowMappingEnabled
static int32_t getShadowMapWidth()
static STATIC_DLL_IMPEXT unique_ptr< Queue< EngineThreadQueueElement > > engineThreadsQueue
void dumpEntities()
Dump entities.
Engine()
Private constructor.
void renderToScreen()
Render scaled main engine to screen.
const string getGraphicsRenderer()
array< bool, EFFECTPASS_COUNT - 1 > effectPassSkip
static int32_t getShadowMapHeight()
unordered_set< Entity * > requirePreRenderEntities
static const vector< string > getRegisteredShader(ShaderType type, bool sort=true)
Returns registered shaders for given type.
unordered_map< string, Entity * > entitiesById
void addEntity(Entity *entity)
Adds an entity by id.
unordered_set< Entity * > requireComputeAnimationEntities
const ShaderParameter getShaderParameter(const string &shaderId, const string ¶meterName)
Returns shader parameter for given shader id and parameter name, if the value does not exist,...
bool computeScreenCoordinateByWorldCoordinate(const Vector3 &worldCoordinate, Vector2 &screenCoordinate, int width=-1, int height=-1)
Convert screen coordinate by world coordinate.
static STATIC_DLL_IMPEXT unique_ptr< TextureManager > textureManager
unique_ptr< Timing > timing
static STATIC_DLL_IMPEXT unique_ptr< SkyRenderShader > skyRenderShader
static STATIC_DLL_IMPEXT Engine * instance
static STATIC_DLL_IMPEXT unique_ptr< MeshManager > meshManager
vector< string > postProcessingPrograms
void resetPostProcessingPrograms()
Clear post processing programs.
void deregisterEntity(Entity *entity)
Removes a entity from internal lists, those entities can also be sub entities from entity hierarchy o...
void dispose()
Shutdown the engine.
void dumpEntityHierarchy(EntityHierarchy *entityHierarchy, int indent, const string &parentNodeId)
Dump entity hierarchy.
static STATIC_DLL_IMPEXT EngineThreadQueueElementPool engineThreadQueueElementPool
static int32_t getShadowMapRenderLookUps()
unique_ptr< ShadowMapping > shadowMapping
static STATIC_DLL_IMPEXT unique_ptr< FrameBufferRenderShader > frameBufferRenderShader
Entity * getEntity(const string &id)
Returns a entity by given id.
unordered_map< Model *, UniqueModelId > objectUniqueModelIdMapping
static STATIC_DLL_IMPEXT unique_ptr< Texture2DRenderShader > texture2DRenderShader
const string getGraphicsVendor()
void unscale()
Disable scaling, which applies to main engine only.
static void setShadowMapSize(int32_t width, int32_t height)
Set shadow map size.
unordered_set< Entity * > autoEmitParticleSystemEntities
unique_ptr< GeometryBuffer > geometryBuffer
void reset()
Removes all entities and caches.
unique_ptr< Camera > camera
static STATIC_DLL_IMPEXT unique_ptr< VBOManager > vboManager
static STATIC_DLL_IMPEXT unique_ptr< PostProcessing > postProcessing
static STATIC_DLL_IMPEXT vector< unique_ptr< EngineThread > > engineThreads
Entity * getEntityByMousePosition(int32_t mouseX, int32_t mouseY, EntityPickingFilter *filter=nullptr, Node **objectNode=nullptr, ParticleSystem **particleSystemEntity=nullptr)
Retrieves entity by mouse position.
static constexpr int ENGINETHREADSQUEUE_PRERENDER_DISPATCH_COUNT
int registerModel(Model *model)
Register model.
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.
void loadTextures(const string &pathName)
Load textures.
void removeEntityFromLists(Entity *entity)
Remove entity.
bool isUsingPostProcessingTemporaryFrameBuffer
static STATIC_DLL_IMPEXT unique_ptr< SkinningShader > skinningShader
DecomposedEntities visibleDecomposedEntities
void resetLists(DecomposedEntities &decomposedEntites)
Reset lists.
unique_ptr< FrameBuffer > gizmoFrameBuffer
void preRender(Camera *camera, DecomposedEntities &decomposedEntites, bool autoEmit, bool computeAnimations)
Computes visibility and animations and other pre render steps.
void registerEntity(Entity *entity)
Adds a entity to internal lists, those entities can also be sub entities from entity hierarchy or par...
static const vector< Shader::ParameterDefaults > * getShaderParameterDefaults(const string &shaderId)
Returns parameter defaults of shader with given id.
array< unique_ptr< Light >, LIGHTS_MAX > lights
Entity hierarchy to be used with engine class.
const vector< Entity * > query(const string &parentId=string())
Query sub entities of parent entity.
const string & getId() override
@ RENDERPASS_POST_POSTPROCESSING
virtual bool isEnabled()=0
virtual void setRenderer(Renderer *renderer)=0
Set up renderer.
virtual const string & getId()=0
Entity * getParentEntity()
virtual bool isFrustumCulling()=0
virtual void setEngine(Engine *engine)=0
Set up engine.
virtual EntityType getEntityType()=0
static constexpr int RENDERPASS_ALL
virtual void initialize()=0
Initiates this entity.
static constexpr int RENDERPASS_MAX
@ ENTITYTYPE_OBJECTRENDERGROUP
@ ENTITYTYPE_OBJECTPARTICLESYSTEM
@ ENTITYTYPE_IMPOSTEROBJECT
@ ENTITYTYPE_FOGPARTICLESYSTEM
@ ENTITYTYPE_POINTSPARTICLESYSTEM
@ ENTITYTYPE_ENVIRONMENTMAPPING
@ ENTITYTYPE_PARTICLESYSTEMGROUP
@ ENTITYTYPE_LODOBJECTIMPOSTER
@ ENTITYTYPE_ENTITYHIERARCHY
Environment mapping entity.
Fog particle system entity to be used with engine class.
static void disableFrameBuffer()
Switches back to non offscreen main frame buffer to be rendered.
void enableFrameBuffer()
Enables this frame buffer to be rendered.
static constexpr int32_t FRAMEBUFFER_COLORBUFFER
static void doPostProcessing(Engine *engine, FrameBuffer *target, FrameBuffer *source, const string &programId, const string &shaderId, FrameBuffer *temporary=nullptr, FrameBuffer *blendToSource=nullptr)
Do post processing into target frame buffer (which can be screen as well when passing nullptr)
static constexpr int32_t FRAMEBUFFER_DEPTHBUFFER
void renderToScreen(Engine *engine, vector< Decal * > &decalEntities)
Render to screen or bound geometry buffer @engine engine.
void enableGeometryBuffer()
Enables this geometry buffer to be rendered.
static void disableGeometryBuffer()
Switches back to non offscreen main frame buffer to be rendered.
Imposter object to be used with engine class.
LOD object + imposter to be used with engine class.
LOD object to be used with engine class.
Lines entity to be used with engine class.
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.
Oct tree partition implementation.
Particle system group, which combines several particle systems into a group, to be used with engine c...
Point particle system entity to be used with engine class.
Shader parameter model class.
const array< float, 4 > getColor4ValueArray() const
const array< float, 4 > getVector4ValueArray() const
const array< float, 3 > getVector3ValueArray() const
const array< float, 2 > getVector2ValueArray() const
PNG texture writer class.
Axis aligned bounding box used for frustum, this is not directly connectable with physics engine.
Line segment helper functions.
Deferred lighint render shader.
Frame buffer render shader.
Interface to lighting shader program.
Particles shader program.
virtual void initializeFrame()=0
Pre Frame Initialization.
virtual void enableDepthBufferTest()=0
Enable depth buffer test.
void setShaderPrefix(const string &shaderPrefix)
Set shader prefix.
virtual bool isSupportingMultithreadedRendering()=0
virtual void finishFrame()=0
Finish frame.
virtual void setClearColor(float red, float green, float blue, float alpha)=0
Set up clear color.
int32_t CLEAR_COLOR_BUFFER_BIT
virtual bool isComputeShaderAvailable()=0
virtual void enableBlending()=0
Enables blending.
virtual void disableBlending()=0
Disables blending.
virtual void initGuiMode()=0
Set up renderer for GUI rendering.
virtual bool isPBRAvailable()=0
virtual const string getVendor()=0
virtual const string getRenderer()=0
virtual void initialize()=0
Initialize renderer.
virtual ByteBuffer * readPixels(int32_t x, int32_t y, int32_t width, int32_t height)=0
Read pixels.
virtual void clear(int32_t mask)=0
Clear render buffer with given mask.
virtual bool isTextureCompressionAvailable()=0
virtual bool isDeferredShadingAvailable()=0
void setEffectPass(int32_t effectPass)
Set effect pass.
virtual void doneGuiMode()=0
Set up renderer for 3d rendering.
int32_t CONTEXTINDEX_DEFAULT
virtual float readPixelDepth(int32_t x, int32_t y)=0
Reads a pixel depth.
virtual bool isGLCLAvailable()=0
virtual void disableDepthBufferTest()=0
Disable depth buffer test.
int32_t CLEAR_DEPTH_BUFFER_BIT
Buffers used to transfer data between main memory to graphics board memory.
Transparent render faces pool.
Shadow mapping shader to create a shadow map.
Shadow mapping shader to render shadow maps.
Interface to compute shader skinning shader program.
Texture 2D render shader.
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Vector2 class representing vector2 mathematical structure and operations with x, y components.
Vector2 & sub(float scalar)
Subtracts a scalar.
Vector2 & scale(const float scalar)
Scales by scalar.
Vector2 clone() const
Clones this vector2.
Vector2 & setX(float x)
Sets x component.
Vector2 & setY(float y)
Sets y component.
Vector3 class representing vector3 mathematical structure and operations with x, y,...
float computeLengthSquared() const
Vector3 clone() const
Clones this vector3.
Vector3 & sub(float scalar)
Subtracts a scalar.
Vector3 & scale(float scalar)
Scales by scalar.
Vector3 & set(float x, float y, float z)
Sets this vector3 by its components.
Vector4 class representing vector4 mathematical structure and operations with x, y,...
File system singleton class.
T * allocate()
Allocate a new element from pool.
void reset()
Reset this pool.
virtual void releaseReference()
Releases a reference, thus decrementing the counter and delete it if reference counter is zero.
virtual void acquireReference()
Acquires a reference, incrementing the counter.
void removeTexture(Texture *texture)
Remove texture.
int addTexture(Texture *texture)
Add texture.
vector< EntityHierarchy * > entityHierarchies
vector< Object * > objects
vector< LODObject * > lodObjects
vector< Lines * > linesEntities
vector< EnvironmentMapping * > environmentMappingEntities
vector< ParticleSystemGroup * > psgs
vector< Object * > objectsPostPostProcessing
vector< ObjectParticleSystem * > opses
vector< ObjectRenderGroup * > objectRenderGroups
vector< Object * > requireComputeAnimationEntities
vector< Entity * > noFrustumCullingEntities
vector< Object * > objectsNoDepthTest
vector< Decal * > decalEntities
vector< Object * > objectsForwardShading
vector< Object * > objectsGizmo
vector< Object * > requirePreRenderEntities
virtual bool filterEntity(Entity *entity)=0
Filter entity.
Particle system entity interface.
virtual int emitParticles()=0
Adds particles to this particle entity at given position.
Entity renderer parameters.