4#include <unordered_map>
28using std::unordered_map;
165 void setupMaterial(
int contextIdx,
Object3DNode* object3DNode, int32_t facesEntityIdx, int32_t renderTypes,
bool updateOnly,
string& materialKey,
const string& currentMaterialKey =
string());
184 const vector<Object3D*>& objects,
195 for (
auto objectIdx = 0; objectIdx < objects.size(); objectIdx++) {
196 auto object = objects[objectIdx];
197 if (object->enabledInstances == 0)
continue;
198 if (effectPass != 0 && object->excludeFromEffectPass == effectPass)
continue;
199 if (object->renderPass != renderPass)
continue;
200 auto objectUniqueShaderId =
object->getDistanceShader().empty() ==
true?
201 object->getUniqueShaderId():
202 objectCamFromAxis.
set(object->getBoundingBoxTransformed()->getCenter()).
sub(camera->getLookFrom()).
computeLengthSquared() < Math::square(object->getDistanceShaderDistance())?
203 object->getUniqueShaderId():
204 object->getUniqueDistanceShaderId();
206 auto& objectsByModel = objectsByShaders[
object->getModel()];
207 objectsByModel.push_back(
object);
211 auto& context =
contexts[threadIdx];
213 auto& objectsByModels = objectsByShaderAndModelIt.second;
214 for (
auto& objectsByModelIt: objectsByModels) {
215 auto& objectsByModel = objectsByModelIt.second;
216 if (objectsByModel.size() == 0) {
219 if (objectsByModel.size() > 0) {
221 for (
auto object: objectsByModel) {
222 if (context.objectsByModelToRender.size() == 0 ||
223 (object->instances == context.objectsByModelToRender[0]->instances &&
224 object->enabledInstances == context.objectsByModelToRender[0]->enabledInstances)) {
225 context.objectsByModelToRender.push_back(
object);
227 context.objectsByModelNotRendered.push_back(
object);
231 objectsByModel = context.objectsByModelNotRendered;
232 context.objectsByModelToRender.clear();
233 context.objectsByModelNotRendered.clear();
234 }
while (objectsByModel.size() > 0);
236 objectsByModel.clear();
Fog particle system entity to be used with engine class.
Object 3D to be used with engine class.
Object 3D to be used with engine class.
Point particle system entity to be used with engine class.
Representation of a 3d model.
int32_t getEffectPass()
Get effect pass.
virtual bool isInstancedRenderingAvailable()=0
Checks if instanced rendering is available.
void setShader(int contextIdx, const string &id)
Set shader.
Batch renderer for points.
Batch renderer for transparent triangles.
Entity renderer transparent render faces node pool.
EntityRenderer(Engine *engine, Renderer *renderer)
Public constructor.
static constexpr int32_t RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY
static constexpr int32_t INSTANCEDRENDERING_OBJECTS_MAX
void prepareTransparentFaces(const vector< TransparentRenderFace * > &transparentRenderFaces)
Renders transparent faces TODO: guess this should be optimized regarding GL commands skinned mesh is ...
void render(Entity::RenderPass renderPass, const vector< Object3D * > &objects, bool renderTransparentFaces, int32_t renderTypes)
Renders all given objects.
static constexpr int32_t RENDERTYPE_TEXTUREARRAYS
EntityRenderer_TransparentRenderFacesGroupPool * transparentRenderFacesGroupPool
static constexpr int32_t RENDERTYPE_NORMALS
void renderObjectsOfSameTypeInstanced(int threadIdx, const vector< Object3D * > &objects, bool collectTransparentFaces, int32_t renderTypes, TransparentRenderFacesPool *transparentRenderFacesPool)
Renders multiple objects of same type(with same model) using instancing.
BatchRendererTriangles * acquireTrianglesBatchRenderer()
static constexpr int32_t RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY
void renderObjectsOfSameType(int threadIdx, const vector< Object3D * > &objects, bool collectTransparentFaces, int32_t renderTypes, TransparentRenderFacesPool *transparentRenderFacesPool)
Renders multiple objects of same type(with same model)
TransparentRenderFacesPool * transparentRenderFacesPool
BatchRendererPoints * psePointBatchRenderer
bool checkMaterialChangable(Object3DNode *object3DNode, int32_t facesEntityIdx, int32_t renderTypes)
Checks if a material could change when having multiple objects but same model.
static constexpr int32_t RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY
static constexpr int32_t RENDERTYPE_ALL
static constexpr int32_t RENDERTYPE_TEXTURES
static constexpr int32_t RENDERTYPE_MATERIALS
static constexpr int32_t RENDERTYPE_SHADOWMAPPING
unordered_map< uint8_t, unordered_map< Model *, vector< Object3D * > > > objectsByShadersAndModels
void releaseTransparentFacesGroups()
Release transparent faces groups.
static constexpr int32_t RENDERTYPE_RENDERGROUP_OBJECTORIGIN
vector< Object3DRenderContext > contexts
void renderFunction(int threadIdx, Entity::RenderPass renderPass, const vector< Object3D * > &objects, unordered_map< uint8_t, unordered_map< Model *, vector< Object3D * > > > &objectsByShadersAndModels, bool renderTransparentFaces, int renderTypes, TransparentRenderFacesPool *transparentRenderFacesPool)
Render function.
static constexpr int32_t RENDERTYPE_LIGHTS
static constexpr int32_t RENDERTYPE_EFFECTCOLORS
void setupMaterial(int contextIdx, Object3DNode *object3DNode, int32_t facesEntityIdx, int32_t renderTypes, bool updateOnly, string &materialKey, const string ¤tMaterialKey=string())
Set ups a material for rendering.
void renderTransparentFacesGroups(int contextIdx)
Render transparent faces groups.
vector< TransparentRenderFace * > nodeTransparentRenderFaces
void clearMaterial(int contextIdx)
Clear material for rendering.
unordered_map< string, TransparentRenderFacesGroup * > transparentRenderFacesGroups
static constexpr int32_t BATCHRENDERER_MAX
void reset()
Resets the object 3d renderer.
~EntityRenderer()
Destructor.
RenderTransparentRenderPointsPool * renderTransparentRenderPointsPool
vector< BatchRendererTriangles * > trianglesBatchRenderers
void renderObjectsOfSameTypeNonInstanced(const vector< Object3D * > &objects, bool collectTransparentFaces, int32_t renderTypes)
Renders multiple objects of same type(with same model) not using instancing.
void renderTransparentFaces()
Renders collected transparent faces.
Object 3D node VBO renderer.
Object 3d node specifically for rendering.
vector< int32_t > specularMaterialDynamicDiffuseTextureIdsByEntities
static constexpr int32_t TEXTUREID_NONE
Render transparent render points pool.
Transparent render faces group.
Transparent render faces pool.
Transparent render points pool.
Simple class to determine if a transform is negative.
Vector3 & set(float x, float y, float z)
Set up vector.
float computeLengthSquared() const
Vector3 & sub(const Vector3 &v)
Subtracts a vector.
ByteBuffer * bbEffectColorAdds
vector< Object3D * > objectsByModelToRender
vector< int32_t > * vboInstancedRenderingIds
ByteBuffer * bbMvMatrices
ByteBuffer * bbEffectColorMuls
vector< Object3D * > objectsToRender
vector< Object3D * > objectsByModelNotRendered
Matrix4x4Negative matrix4x4Negative
vector< Object3D * > objectsNotRendered