8 #include <unordered_map>
9 #include <unordered_set>
52 using std::make_unique;
57 using std::unique_ptr;
58 using std::unordered_map;
59 using std::unordered_set;
266 vector<ObjectParticleSystem*>
opses;
268 vector<ParticleSystemGroup*>
psgs;
552 const vector<Entity*>& entities,
553 DecomposedEntities& decomposedEntities,
554 bool decomposeAllEntities =
false
578 void preRender(
Camera*
camera, DecomposedEntities& decomposedEntites,
bool autoEmit,
bool computeAnimations);
594 void resetLists(DecomposedEntities& decomposedEntites);
828 return uniqueShaderId;
830 return uniqueShaderIdIt->second;
838 vector<string> result;
839 for (
const auto& shader:
shaders) {
840 if (shader.internal ==
true)
continue;
841 if (shader.type == type) {
842 result.push_back(shader.id);
845 if (sort ==
true) std::sort(result.begin(), result.end());
856 inline static void registerShader(
ShaderType type,
const string& shaderId,
const vector<Shader::ParameterDefaults>& parameterDefaults = {},
bool internal =
false) {
858 Console::println(
"Engine::registerShader(): Shader already registered: " + shaderId);
863 .internal =
internal,
866 .parameterDefaults = parameterDefaults,
867 .parameterDefaultsByName = {}
870 for (
const auto& shaderParameterDefaults:
shaders.back().parameterDefaults) {
871 shaders.back().parameterDefaultsByName[shaderParameterDefaults.name] = &shaderParameterDefaults;
885 Console::println(
"Engine::getShaderParameterDefaults(): No registered shader: " + shaderId);
888 return &shaderIt->second->parameterDefaults;
897 vector<string> shaderParameterNames;
900 Console::println(
"Engine::getShaderParameterNames(): No registered shader: " + shaderId);
901 return shaderParameterNames;
903 for (
const auto& shaderParameterName: shaderIt->second->parameterDefaults) {
904 shaderParameterNames.push_back(shaderParameterName.name);
906 return shaderParameterNames;
920 Console::println(
"Engine::getDefaultShaderParameter(): no shader registered with id: " + shaderId);
924 const auto shader = shaderIt->second;
925 auto shaderParameterIt = shader->parameterDefaultsByName.find(parameterName);
926 if (shaderParameterIt == shader->parameterDefaultsByName.end()) {
928 Console::println(
"Engine::getDefaultShaderParameter(): no default for shader registered with id: " + shaderId +
", and parameter name: " + parameterName);
932 return shaderParameterIt->second;
948 return defaultShaderParameter->value;
951 const auto& shaderParameterMap = shaderParameterIt->second;
953 auto shaderParameterParameterIt = shaderParameterMap.find(parameterName);
954 if (shaderParameterParameterIt == shaderParameterMap.end()) {
958 return defaultShaderParameter->value;
961 return shaderParameterParameterIt->second;
973 Console::println(
"Engine::setShaderParameter(): no parameter for shader registered with id: " + shaderId +
", and parameter name: " + parameterName);
976 if (currentShaderParameter.getType() != parameterValue.
getType()) {
977 Console::println(
"Engine::setShaderParameter(): parameter type mismatch for shader registered with id: " + shaderId +
", and parameter name: " + parameterName);
1144 if (idx < 0 || idx >=
lights.size())
return nullptr;
1145 return lights[idx].get();
1178 return entityByIdIt->second;
1284 particleSystemEntity
1357 bool makeScreenshot(
const string& pathName,
const string& fileName,
bool removeAlphaChannel =
true);
1400 actions.push_back(unique_ptr<Action>(action));
1450 Node** objectNode =
nullptr,
1500 void doPostProcessing(PostProcessingProgram::RenderPass renderPass,
const array<FrameBuffer*, 2> postProcessingFrameBuffers,
FrameBuffer* targetFrameBuffer);
1518 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);
1559 Console::println(
"Engine::registerModel(): too many models: " + to_string(uniqueModelId) +
" >= " + to_string(
UNIQUEMODELID_MAX));
1564 .id = uniqueModelId,
1567 return uniqueModelId;
1569 auto& uniqueModel = objectUniqueModelIdMappingIt->second;
1570 uniqueModel.count++;
1571 return uniqueModel.id;
1583 auto& uniqueModel = objectUniqueModelIdMappingIt->second;
1584 uniqueModel.count--;
1585 if (uniqueModel.count == 0) {
Application base class, please make sure to allocate application on heap to have correct application ...
Color 4 definition class.
Decal entity to be used with engine class.
EngineThreadQueueElement * instantiate() override
Instantiate a transparent render face.
EngineThreadQueueElementPool()
Public constructor.
array< vector< Object * >, Engine::UNIQUEMODELID_MAX > objectsByModels
TransparentRenderFacesPool * getTransparentRenderFacesPool()
unique_ptr< TransparentRenderFacesPool > transparentRenderFacesPool
Queue< EngineThreadQueueElement > * queue
void resetProcessedElements()
Reset processed element count.
int getProcessedElements()
volatile int elementsProcessed
EngineThread(int idx, Queue< EngineThreadQueueElement > *queue)
Constructor.
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
Renderer::RendererType getGraphicsRendererType()
static STATIC_DLL_IMPEXT Renderer * renderer
static STATIC_DLL_IMPEXT unique_ptr< DeferredLightingRenderShader > deferredLightingRenderShader
static STATIC_DLL_IMPEXT int32_t environmentMappingWidth
unique_ptr< Partition > partition
static GUIShader * getGUIShader()
Vector3 computeWorldCoordinateByMousePosition(int32_t mouseX, int32_t mouseY, Camera *camera)
Compute world coordinate from mouse position TODO: this does not work with GLES2.
TextureAtlas & getPointParticleSystemTextureAtlas()
void initRendering()
Initiates the rendering process updates timing, updates camera.
static STATIC_DLL_IMPEXT int32_t shadowMapHeight
void doPostProcessing(PostProcessingProgram::RenderPass renderPass, const array< FrameBuffer *, 2 > postProcessingFrameBuffers, FrameBuffer *targetFrameBuffer)
Do post processing.
Light * getLightAt(int32_t idx)
Returns light at idx (0 <= idx < 8)
TextureAtlas decalsTextureAtlas
vector< unique_ptr< Action > > actions
TextureAtlas & getDecalsTextureAtlas()
void reshape(int32_t width, int32_t height)
Reshape.
void display()
Renders the scene.
static void setAnimationComputationReduction1Distance(float animationComputationReduction1Distance)
Set distance of animated object including skinned objects from camera which animation computation wil...
ShadowMapping * getShadowMapping()
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.
static const Shader::ParameterDefaults * getDefaultShaderParameter(const string &shaderId, const string ¶meterName)
Returns shader parameter default value for given shader id and parameter name.
static Engine * getInstance()
Returns engine instance.
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 float getAnimationComputationReduction2Distance()
static STATIC_DLL_IMPEXT int32_t shadowMapRenderLookUps
static STATIC_DLL_IMPEXT int threadCount
static STATIC_DLL_IMPEXT float animationComputationReduction1Distance
static ShadowMapRenderShader * getShadowMapRenderShader()
Vector3 computeGizmoCoordinateByMousePosition(int32_t mouseX, int32_t mouseY, float z)
Compute gizmo coordinate from mouse position and z value.
static void setEnvironmentMappingSize(int32_t width, int32_t height)
Set environment mapping size.
unique_ptr< FrameBuffer > postProcessingTemporaryFrameBuffer
FrameBuffer * getFrameBuffer()
EntityRenderer * getEntityRenderer()
GeometryBuffer * getGeometryBuffer()
Entity * getEntityContactPointByMousePosition(int32_t mouseX, int32_t mouseY, EntityPickingFilter *filter)
Retrieves object by mouse position.
static LightingShader * getLightingShader()
const Color4 & getSceneColor() const
void setShaderParameter(const string &shaderId, const string ¶meterName, const ShaderParameter ¶meterValue)
Set shader parameter for given shader id and parameter name.
void enqueueAction(Action *action)
Add action to action queue to be executed before next engine update.
static STATIC_DLL_IMPEXT bool skinningShaderEnabled
unordered_set< Entity * > noFrustumCullingEntities
static FrameBufferRenderShader * getFrameBufferRenderShader()
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.
static STATIC_DLL_IMPEXT int32_t environmentMappingHeight
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 void setAnimationBlendingTime(float animationBlendingTime)
Set animation blending time.
static STATIC_DLL_IMPEXT unique_ptr< LightingShader > lightingShader
void decomposeEntityType(Entity *entity, DecomposedEntities &decomposedEntities, bool decomposeAllEntities=false)
Decompose entity type.
void updateEntityRegistration(Entity *entity)
Updates registration of engine by performing deregisterEntity() and registerEntity()
Renderer::Renderer_Statistics getRendererStatistics()
@ SHADERTYPE_POSTPROCESSING
void setSkyShaderEnabled(bool skyShaderEnabled)
Set sky shader enabled.
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
UniquePtrSequenceIterator< Light > getLights()
static STATIC_DLL_IMPEXT float animationComputationReduction2Distance
void deregisterModel(Model *model)
Deregister model.
static Renderer * getRenderer()
@ EFFECTPASS_LIGHTSCATTERING
static ParticlesShader * getParticlesShader()
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
Partition * getPartition()
static PostProcessingShader * getPostProcessingShader()
static STATIC_DLL_IMPEXT unique_ptr< ShadowMapRenderShader > shadowMappingShaderRender
void scale(int32_t width, int32_t height)
Scale which applies to main engine only.
static TextureManager * getTextureManager()
static STATIC_DLL_IMPEXT unordered_map< string, uint8_t > uniqueShaderIds
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
bool isSkyShaderEnabled()
AnimationProcessingTarget
void dumpEntities()
Dump entities.
Engine()
Private constructor.
void renderToScreen()
Render scaled main engine to screen.
void setShadowMapLightEyeDistanceScale(float shadowMapLightEyeDistanceScale)
Set shadow map light eye distance scale.
const string getGraphicsRenderer()
array< bool, EFFECTPASS_COUNT - 1 > effectPassSkip
static STATIC_DLL_IMPEXT list< Shader > shaders
static BRDFLUTShader * getBRDFLUTShader()
static void setAnimationComputationReduction2Distance(float animationComputationReduction2Distance)
Set distance of animated object including skinned objects from camera which animation computation wil...
static int32_t getShadowMapHeight()
static void setThreadCount(int threadCount)
Set engine thread count.
unordered_set< Entity * > requirePreRenderEntities
static SkyRenderShader * getSkyRenderShader()
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 float getAnimationComputationReduction1Distance()
static constexpr int UNIQUEMODELID_MAX
static STATIC_DLL_IMPEXT unique_ptr< SkyRenderShader > skyRenderShader
static STATIC_DLL_IMPEXT Engine * instance
static VBOManager * getVBOManager()
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 int getThreadCount()
static void set4K(bool have4K)
Set if having 4k.
float shadowMapLightEyeDistanceScale
static STATIC_DLL_IMPEXT unique_ptr< Texture2DRenderShader > texture2DRenderShader
float getShadowMapLightEyeDistanceScale()
static DeferredLightingRenderShader * getDeferredLightingRenderShader()
static void registerShader(ShaderType type, const string &shaderId, const vector< Shader::ParameterDefaults > ¶meterDefaults={}, bool internal=false)
Register shader.
static STATIC_DLL_IMPEXT float animationBlendingTime
const string getGraphicsVendor()
static STATIC_DLL_IMPEXT bool have4K
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 float getAnimationBlendingTime()
static int32_t getEnvironmentMappingWidth()
static STATIC_DLL_IMPEXT unique_ptr< PostProcessing > postProcessing
void setSceneColor(const Color4 &sceneColor)
Set scene color.
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.
static STATIC_DLL_IMPEXT int32_t shadowMapWidth
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.
static int32_t getEnvironmentMappingHeight()
void loadTextures(const string &pathName)
Load textures.
void removeEntityFromLists(Entity *entity)
Remove entity.
static MeshManager * getMeshManager()
Camera * getGizmoCamera()
unordered_map< string, unordered_map< string, ShaderParameter > > shaderParameters
bool isUsingPostProcessingTemporaryFrameBuffer
static STATIC_DLL_IMPEXT unique_ptr< SkinningShader > skinningShader
DecomposedEntities visibleDecomposedEntities
void resetLists(DecomposedEntities &decomposedEntites)
Reset lists.
static const vector< string > getShaderParameterNames(const string &shaderId)
Returns shader parameter names of shader with given id.
unique_ptr< FrameBuffer > gizmoFrameBuffer
void preRender(Camera *camera, DecomposedEntities &decomposedEntites, bool autoEmit, bool computeAnimations)
Computes visibility and animations and other pre render steps.
static uint8_t getUniqueShaderId(const string &shaderId)
static SkinningShader * getSkinningShader()
void registerEntity(Entity *entity)
Adds a entity to internal lists, those entities can also be sub entities from entity hierarchy or par...
static LinesShader * getLinesShader()
int32_t getScaledHeight()
static constexpr int ENGINETHREADSQUEUE_RENDER_DISPATCH_COUNT
static STATIC_DLL_IMPEXT unordered_map< string, Shader * > shadersById
static const vector< Shader::ParameterDefaults > * getShaderParameterDefaults(const string &shaderId)
Returns parameter defaults of shader with given id.
static ShadowMapCreationShader * getShadowMapCreationShader()
array< unique_ptr< Light >, LIGHTS_MAX > lights
Entity hierarchy to be used with engine class.
Environment mapping entity.
Fog particle system entity to be used with engine class.
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.
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.
Representation of a 3D model.
Deferred lighint render shader.
Frame buffer render shader.
Lighting shader implementation.
Interface to lighting shader program.
Particles shader program.
Engine connector of GL2 renderer to other engine functionality.
Engine connector of GL3 renderer to other engine functionality.
Engine connector of GLES2 renderer to other engine functionality.
Engine connector of VK renderer to other engine functionality.
RendererType getRendererType()
virtual const Renderer_Statistics getStatistics()=0
Batch renderer for points.
Batch renderer for transparent triangles.
Buffers used to transfer data between main memory to graphics board memory.
Object node mesh specifically for rendering.
Object node VBO renderer.
Object node specifically for rendering.
Transparent render faces group.
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.
Matrix3x3 class representing matrix3x3 mathematical structure and operations for 2d space.
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Vector2 class representing vector2 mathematical structure and operations with x, y components.
Vector3 class representing vector3 mathematical structure and operations with x, y,...
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< LODObjectImposter * > lodObjectsImposter
vector< Entity * > noFrustumCullingEntities
vector< Object * > objectsNoDepthTest
vector< Decal * > decalEntities
vector< Object * > objectsForwardShading
vector< Object * > objectsGizmo
vector< Object * > requirePreRenderEntities
struct tdme::engine::Engine::EngineThreadQueueElement::@0 animations
Entity::RenderPass renderPass
vector< Object * > objects
bool collectTransparentFaces
struct tdme::engine::Engine::EngineThreadQueueElement::@1 rendering
const ShaderParameter min
const ShaderParameter max
const ShaderParameter value
const ShaderParameter step
const vector< ParameterDefaults > parameterDefaults
unordered_map< string, const ParameterDefaults * > parameterDefaultsByName
Particle system entity interface.
Entity renderer parameters.
unique_ptr sequence iterator
#define STATIC_DLL_IMPEXT
#define FORBID_CLASS_COPY(CLASS)