mirror of
https://github.com/overte-org/overte.git
synced 2025-07-22 22:34:12 +02:00
make sure all entities are rendering in pipeline part 1
This commit is contained in:
parent
7fde574a2a
commit
c6fb22b915
12 changed files with 39 additions and 92 deletions
|
@ -493,45 +493,27 @@ void EntityTreeRenderer::render(RenderArgs* renderArgs) {
|
||||||
if (_tree && !_shuttingDown) {
|
if (_tree && !_shuttingDown) {
|
||||||
renderArgs->_renderer = this;
|
renderArgs->_renderer = this;
|
||||||
|
|
||||||
checkPendingAddToScene(renderArgs);
|
|
||||||
|
|
||||||
Model::startScene(renderArgs->_renderSide);
|
Model::startScene(renderArgs->_renderSide);
|
||||||
|
|
||||||
ViewFrustum* frustum = (renderArgs->_renderMode == RenderArgs::SHADOW_RENDER_MODE) ?
|
ViewFrustum* frustum = (renderArgs->_renderMode == RenderArgs::SHADOW_RENDER_MODE) ?
|
||||||
_viewState->getShadowViewFrustum() : _viewState->getCurrentViewFrustum();
|
_viewState->getShadowViewFrustum() : _viewState->getCurrentViewFrustum();
|
||||||
|
|
||||||
// Setup batch transform matrices
|
|
||||||
gpu::Batch batch; // FIX ME - this is very suspicious!
|
|
||||||
glm::mat4 projMat;
|
|
||||||
Transform viewMat;
|
|
||||||
frustum->evalProjectionMatrix(projMat);
|
|
||||||
frustum->evalViewTransform(viewMat);
|
|
||||||
batch.setProjectionTransform(projMat);
|
|
||||||
batch.setViewTransform(viewMat);
|
|
||||||
|
|
||||||
renderArgs->_batch = &batch; // FIX ME - this is very suspicious!
|
|
||||||
|
|
||||||
_tree->lockForRead();
|
_tree->lockForRead();
|
||||||
|
|
||||||
// Whenever you're in an intersection between zones, we will always choose the smallest zone.
|
// Whenever you're in an intersection between zones, we will always choose the smallest zone.
|
||||||
_bestZone = NULL; // NOTE: Is this what we want?
|
_bestZone = NULL; // NOTE: Is this what we want?
|
||||||
_bestZoneVolume = std::numeric_limits<float>::max();
|
_bestZoneVolume = std::numeric_limits<float>::max();
|
||||||
|
|
||||||
|
// FIX ME: right now the renderOperation does the following:
|
||||||
|
// 1) determining the best zone (not really rendering)
|
||||||
|
// 2) render the debug cell details
|
||||||
|
// we should clean this up
|
||||||
_tree->recurseTreeWithOperation(renderOperation, renderArgs);
|
_tree->recurseTreeWithOperation(renderOperation, renderArgs);
|
||||||
|
|
||||||
applyZonePropertiesToScene(_bestZone);
|
applyZonePropertiesToScene(_bestZone);
|
||||||
|
|
||||||
// we must call endScene while we still have the tree locked so that no one deletes a model
|
|
||||||
// on us while rendering the scene
|
|
||||||
Model::endScene(renderArgs);
|
|
||||||
_tree->unlock();
|
_tree->unlock();
|
||||||
|
|
||||||
// FIX ME - this is very suspicious!
|
|
||||||
// glPushMatrix();
|
|
||||||
// renderArgs->_context->render(batch);
|
|
||||||
// glPopMatrix();
|
|
||||||
|
|
||||||
renderArgs->_batch = nullptr;
|
|
||||||
|
|
||||||
// stats...
|
// stats...
|
||||||
_meshesConsidered = renderArgs->_meshesConsidered;
|
_meshesConsidered = renderArgs->_meshesConsidered;
|
||||||
_meshesRendered = renderArgs->_meshesRendered;
|
_meshesRendered = renderArgs->_meshesRendered;
|
||||||
|
@ -715,39 +697,6 @@ void EntityTreeRenderer::renderElement(OctreeElement* element, RenderArgs* args)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// hack for models and other entities that don't yet play well with others. :(
|
|
||||||
if (!entityItem->canRenderInScene()) {
|
|
||||||
// render entityItem
|
|
||||||
AABox entityBox = entityItem->getAABox();
|
|
||||||
|
|
||||||
// TODO: some entity types (like lights) might want to be rendered even
|
|
||||||
// when they are outside of the view frustum...
|
|
||||||
float distance = args->_viewFrustum->distanceToCamera(entityBox.calcCenter());
|
|
||||||
|
|
||||||
bool outOfView = args->_viewFrustum->boxInFrustum(entityBox) == ViewFrustum::OUTSIDE;
|
|
||||||
if (!outOfView) {
|
|
||||||
bool bigEnoughToRender = _viewState->shouldRenderMesh(entityBox.getLargestDimension(), distance);
|
|
||||||
|
|
||||||
if (bigEnoughToRender) {
|
|
||||||
renderProxies(entityItem, args);
|
|
||||||
|
|
||||||
Glower* glower = NULL;
|
|
||||||
if (entityItem->getGlowLevel() > 0.0f) {
|
|
||||||
glower = new Glower(args, entityItem->getGlowLevel());
|
|
||||||
}
|
|
||||||
entityItem->render(args);
|
|
||||||
args->_itemsRendered++;
|
|
||||||
if (glower) {
|
|
||||||
delete glower;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
args->_itemsTooSmall++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
args->_itemsOutOfView++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1093,34 +1042,14 @@ void EntityTreeRenderer::addingEntity(const EntityItemID& entityID) {
|
||||||
|
|
||||||
void EntityTreeRenderer::addEntityToScene(EntityItemPointer entity) {
|
void EntityTreeRenderer::addEntityToScene(EntityItemPointer entity) {
|
||||||
// here's where we add the entity payload to the scene
|
// here's where we add the entity payload to the scene
|
||||||
if (entity && entity->canRenderInScene()) {
|
render::PendingChanges pendingChanges;
|
||||||
if (entity->readyToAddToScene()) {
|
auto scene = _viewState->getMain3DScene();
|
||||||
render::PendingChanges pendingChanges;
|
if (entity->addToScene(entity, scene, pendingChanges)) {
|
||||||
auto scene = _viewState->getMain3DScene();
|
_entitiesInScene.insert(entity);
|
||||||
if (entity->addToScene(entity, scene, pendingChanges)) {
|
|
||||||
_entitiesInScene.insert(entity);
|
|
||||||
}
|
|
||||||
scene->enqueuePendingChanges(pendingChanges);
|
|
||||||
} else {
|
|
||||||
if (!_pendingAddToScene.contains(entity)) {
|
|
||||||
_pendingAddToScene << entity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityTreeRenderer::checkPendingAddToScene(RenderArgs* renderArgs) {
|
|
||||||
QSet<EntityItemPointer> addedToScene;
|
|
||||||
foreach (auto entity, _pendingAddToScene) {
|
|
||||||
if (entity->readyToAddToScene(renderArgs)) {
|
|
||||||
addEntityToScene(entity);
|
|
||||||
addedToScene << entity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach (auto addedEntity, addedToScene) {
|
|
||||||
_pendingAddToScene.remove(addedEntity);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EntityTreeRenderer::entitySciptChanging(const EntityItemID& entityID) {
|
void EntityTreeRenderer::entitySciptChanging(const EntityItemID& entityID) {
|
||||||
if (_tree && !_shuttingDown) {
|
if (_tree && !_shuttingDown) {
|
||||||
|
|
|
@ -123,9 +123,7 @@ protected:
|
||||||
virtual Octree* createTree() { return new EntityTree(true); }
|
virtual Octree* createTree() { return new EntityTree(true); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void checkPendingAddToScene(RenderArgs* renderArgs);
|
|
||||||
void addEntityToScene(EntityItemPointer entity);
|
void addEntityToScene(EntityItemPointer entity);
|
||||||
QSet<EntityItemPointer> _pendingAddToScene;
|
|
||||||
|
|
||||||
void applyZonePropertiesToScene(std::shared_ptr<ZoneEntityItem> zone);
|
void applyZonePropertiesToScene(std::shared_ptr<ZoneEntityItem> zone);
|
||||||
void renderElementProxy(EntityTreeElement* entityTreeElement, RenderArgs* args);
|
void renderElementProxy(EntityTreeElement* entityTreeElement, RenderArgs* args);
|
||||||
|
|
|
@ -56,7 +56,6 @@ private:
|
||||||
|
|
||||||
#define SIMPLE_RENDERABLE() \
|
#define SIMPLE_RENDERABLE() \
|
||||||
public: \
|
public: \
|
||||||
virtual bool canRenderInScene() { return true; } \
|
|
||||||
virtual bool addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) { return _renderHelper.addToScene(self, scene, pendingChanges); } \
|
virtual bool addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) { return _renderHelper.addToScene(self, scene, pendingChanges); } \
|
||||||
virtual void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) { _renderHelper.removeFromScene(self, scene, pendingChanges); } \
|
virtual void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) { _renderHelper.removeFromScene(self, scene, pendingChanges); } \
|
||||||
private: \
|
private: \
|
||||||
|
|
|
@ -28,7 +28,7 @@ public:
|
||||||
|
|
||||||
virtual void render(RenderArgs* args);
|
virtual void render(RenderArgs* args);
|
||||||
|
|
||||||
SIMPLE_RENDERABLE()
|
SIMPLE_RENDERABLE();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int _lineVerticesID;
|
int _lineVerticesID;
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
|
|
||||||
|
#include <AbstractViewStateInterface.h>
|
||||||
#include <DeferredLightingEffect.h>
|
#include <DeferredLightingEffect.h>
|
||||||
#include <Model.h>
|
#include <Model.h>
|
||||||
#include <PerfStat.h>
|
#include <PerfStat.h>
|
||||||
|
@ -210,6 +211,19 @@ void RenderableModelEntityItem::render(RenderArgs* args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasModel()) {
|
if (hasModel()) {
|
||||||
|
if (_model) {
|
||||||
|
// check to see if when we added our models to the scene they were ready, if they were not ready, then
|
||||||
|
// fix them up in the scene
|
||||||
|
render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene();
|
||||||
|
render::PendingChanges pendingChanges;
|
||||||
|
if (_model->needsFixupInScene()) {
|
||||||
|
_model->removeFromScene(scene, pendingChanges);
|
||||||
|
_model->addToScene(scene, pendingChanges);
|
||||||
|
}
|
||||||
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
remapTextures();
|
remapTextures();
|
||||||
{
|
{
|
||||||
float alpha = getLocalRenderAlpha();
|
float alpha = getLocalRenderAlpha();
|
||||||
|
|
|
@ -23,7 +23,7 @@ public:
|
||||||
|
|
||||||
void updateQuads(RenderArgs* args, bool textured);
|
void updateQuads(RenderArgs* args, bool textured);
|
||||||
|
|
||||||
SIMPLE_RENDERABLE()
|
SIMPLE_RENDERABLE();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include "PolyVoxEntityItem.h"
|
#include "PolyVoxEntityItem.h"
|
||||||
#include "RenderableDebugableEntityItem.h"
|
#include "RenderableDebugableEntityItem.h"
|
||||||
|
#include "RenderableEntityItem.h"
|
||||||
|
|
||||||
class RenderablePolyVoxEntityItem : public PolyVoxEntityItem {
|
class RenderablePolyVoxEntityItem : public PolyVoxEntityItem {
|
||||||
public:
|
public:
|
||||||
|
@ -70,6 +71,8 @@ public:
|
||||||
virtual void setAll(uint8_t toValue);
|
virtual void setAll(uint8_t toValue);
|
||||||
|
|
||||||
virtual void setVoxelInVolume(glm::vec3 position, uint8_t toValue);
|
virtual void setVoxelInVolume(glm::vec3 position, uint8_t toValue);
|
||||||
|
|
||||||
|
SIMPLE_RENDERABLE();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// The PolyVoxEntityItem class has _voxelData which contains dimensions and compressed voxel data. The dimensions
|
// The PolyVoxEntityItem class has _voxelData which contains dimensions and compressed voxel data. The dimensions
|
||||||
|
|
|
@ -26,7 +26,7 @@ public:
|
||||||
|
|
||||||
virtual void render(RenderArgs* args);
|
virtual void render(RenderArgs* args);
|
||||||
|
|
||||||
SIMPLE_RENDERABLE()
|
SIMPLE_RENDERABLE();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
#include <TextEntityItem.h>
|
#include <TextEntityItem.h>
|
||||||
#include <TextRenderer3D.h>
|
#include <TextRenderer3D.h>
|
||||||
|
|
||||||
|
#include "RenderableEntityItem.h"
|
||||||
|
|
||||||
const int FIXED_FONT_POINT_SIZE = 40;
|
const int FIXED_FONT_POINT_SIZE = 40;
|
||||||
|
|
||||||
class RenderableTextEntityItem : public TextEntityItem {
|
class RenderableTextEntityItem : public TextEntityItem {
|
||||||
|
@ -27,7 +29,8 @@ public:
|
||||||
~RenderableTextEntityItem() { delete _textRenderer; }
|
~RenderableTextEntityItem() { delete _textRenderer; }
|
||||||
|
|
||||||
virtual void render(RenderArgs* args);
|
virtual void render(RenderArgs* args);
|
||||||
virtual bool canRenderInScene() { return false; } // we don't yet play well with others
|
|
||||||
|
SIMPLE_RENDERABLE();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TextRenderer3D* _textRenderer = TextRenderer3D::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE / 2.0f);
|
TextRenderer3D* _textRenderer = TextRenderer3D::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE / 2.0f);
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
|
|
||||||
#include <WebEntityItem.h>
|
#include <WebEntityItem.h>
|
||||||
|
|
||||||
|
#include "RenderableEntityItem.h"
|
||||||
|
|
||||||
class OffscreenQmlSurface;
|
class OffscreenQmlSurface;
|
||||||
|
|
||||||
class RenderableWebEntityItem : public WebEntityItem {
|
class RenderableWebEntityItem : public WebEntityItem {
|
||||||
|
@ -24,7 +26,8 @@ public:
|
||||||
|
|
||||||
virtual void render(RenderArgs* args);
|
virtual void render(RenderArgs* args);
|
||||||
virtual void setSourceUrl(const QString& value);
|
virtual void setSourceUrl(const QString& value);
|
||||||
virtual bool canRenderInScene() { return false; } // we don't yet play well with others
|
|
||||||
|
SIMPLE_RENDERABLE();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
OffscreenQmlSurface* _webSurface{ nullptr };
|
OffscreenQmlSurface* _webSurface{ nullptr };
|
||||||
|
|
|
@ -157,8 +157,6 @@ public:
|
||||||
EntityPropertyFlags& propertyFlags, bool overwriteLocalData)
|
EntityPropertyFlags& propertyFlags, bool overwriteLocalData)
|
||||||
{ return 0; }
|
{ return 0; }
|
||||||
|
|
||||||
virtual bool canRenderInScene() { return false; } // does your entity property render using Render Items and Payloads
|
|
||||||
virtual bool readyToAddToScene(RenderArgs* renderArgs = nullptr) { return true; } // we assume you're ready to add
|
|
||||||
virtual bool addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene,
|
virtual bool addToScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene,
|
||||||
render::PendingChanges& pendingChanges) { return false; } // by default entity items don't add to scene
|
render::PendingChanges& pendingChanges) { return false; } // by default entity items don't add to scene
|
||||||
virtual void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene,
|
virtual void removeFromScene(EntityItemPointer self, std::shared_ptr<render::Scene> scene,
|
||||||
|
|
|
@ -925,7 +925,7 @@ void Model::removeFromScene(std::shared_ptr<render::Scene> scene, render::Pendin
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Model::render(RenderArgs* renderArgs, float alpha) {
|
bool Model::render(RenderArgs* renderArgs, float alpha) {
|
||||||
return; //
|
return true; //
|
||||||
PROFILE_RANGE(__FUNCTION__);
|
PROFILE_RANGE(__FUNCTION__);
|
||||||
|
|
||||||
// render the attachments
|
// render the attachments
|
||||||
|
|
Loading…
Reference in a new issue