Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
#5893: Let StaticModelNode attach its renderable surfaces to the rend…
…er entity.
  • Loading branch information
codereader committed Jan 26, 2022
1 parent c613673 commit 6822fcc
Show file tree
Hide file tree
Showing 12 changed files with 56 additions and 47 deletions.
11 changes: 11 additions & 0 deletions include/irender.h
Expand Up @@ -168,6 +168,17 @@ class IRenderEntity
* wireframe representation.
*/
virtual Vector4 getEntityColour() const = 0;

/**
* Associates the given surface with this entity.
* It will be processed during the following lighting mode rendering passes.
*/
virtual void addSurface(const render::IRenderableSurface::Ptr& surface) = 0;

/**
* Removes the surface from this entity.
*/
virtual void removeSurface(const render::IRenderableSurface::Ptr& surface) = 0;
};
typedef std::shared_ptr<IRenderEntity> IRenderEntityPtr;
typedef std::weak_ptr<IRenderEntity> IRenderEntityWeakPtr;
Expand Down
8 changes: 3 additions & 5 deletions include/isurfacerenderer.h
Expand Up @@ -6,8 +6,6 @@
#include "render/ArbitraryMeshVertex.h"
#include "math/Matrix4.h"

class IRenderEntity;

namespace render
{

Expand All @@ -20,6 +18,8 @@ namespace render
class IRenderableSurface
{
public:
using Ptr = std::shared_ptr<IRenderableSurface>;

virtual ~IRenderableSurface() {}

// Returns the vertex array of this surface
Expand Down Expand Up @@ -54,9 +54,7 @@ class ISurfaceRenderer

// Allocate a slot to hold the given surface data, indexed to render triangles.
// Returns the handle which can be used to update or deallocate the data later
// The surface will be associated to the given render entity. Changing the entity
// at a later point will require to remove and re-add the surface.
virtual Slot addSurface(IRenderableSurface& surface, IRenderEntity* entity) = 0;
virtual Slot addSurface(IRenderableSurface& surface) = 0;

// Releases a previously allocated slot. This invalidates the handle.
virtual void removeSurface(Slot slot) = 0;
Expand Down
19 changes: 3 additions & 16 deletions libs/render/RenderableSurface.h
Expand Up @@ -24,12 +24,8 @@ class RenderableSurface :
using ShaderMapping = std::map<ShaderPtr, ISurfaceRenderer::Slot>;
ShaderMapping _shaders;

// Keep track of the last entity we associated this surface to
IRenderEntity* _entity;

protected:
RenderableSurface() :
_entity(nullptr)
RenderableSurface()
{}

public:
Expand All @@ -45,21 +41,14 @@ class RenderableSurface :
// (Non-virtual) update method handling any possible shader change
// The surface is withdrawn from the given shader if it turns out
// to be different from the last update.
void attachToShader(const ShaderPtr& shader, IRenderEntity* entity)
void attachToShader(const ShaderPtr& shader)
{
if (entity && _entity != entity)
{
// Detach if the render entity is changing
detach();
}

if (_shaders.count(shader) > 0)
{
return; // already attached
}

_entity = entity;
_shaders[shader] = shader->addSurface(*this, entity);
_shaders[shader] = shader->addSurface(*this);
}

// Notifies all the attached shaders that the surface geometry changed
Expand All @@ -78,8 +67,6 @@ class RenderableSurface :
{
detachFromShader(_shaders.begin());
}

_entity = nullptr;
}

// Renders the surface stored in our single slot
Expand Down
10 changes: 10 additions & 0 deletions radiantcore/entity/EntityNode.cpp
Expand Up @@ -200,6 +200,16 @@ const Vector3& EntityNode::getDirection() const
return _direction;
}

void EntityNode::addSurface(const render::IRenderableSurface::Ptr& surface)
{
// TODO
}

void EntityNode::removeSurface(const render::IRenderableSurface::Ptr& surface)
{
// TODO
}

std::string EntityNode::getFingerprint()
{
std::map<std::string, std::string> sortedKeyValues;
Expand Down
3 changes: 3 additions & 0 deletions radiantcore/entity/EntityNode.h
Expand Up @@ -124,6 +124,9 @@ class EntityNode :
virtual float getShaderParm(int parmNum) const override;
virtual const Vector3& getDirection() const override;

virtual void addSurface(const render::IRenderableSurface::Ptr& surface) override;
virtual void removeSurface(const render::IRenderableSurface::Ptr& surface) override;

// IMatrixTransform implementation
Matrix4 localToParent() const override { return _localToParent; }
Matrix4& localToParent() override { return _localToParent; }
Expand Down
19 changes: 2 additions & 17 deletions radiantcore/model/NullModelNode.cpp
Expand Up @@ -101,8 +101,8 @@ void NullModelNode::attachToShaders()

if (!renderSystem) return;

_renderableBox.attachToShader(_fillShader, _renderEntity);
_renderableBox.attachToShader(_wireShader, _renderEntity);
_renderableBox.attachToShader(_fillShader);
_renderableBox.attachToShader(_wireShader);

_attachedToShaders = true;
}
Expand All @@ -118,21 +118,6 @@ const AABB& NullModelNode::localAABB() const
return _nullModel->localAABB();
}

void NullModelNode::onInsertIntoScene(scene::IMapRootNode& root)
{
Node::onInsertIntoScene(root);

if (_fillShader)
{
_fillShader->addSurface(_renderableBox, _renderEntity);
}

if (_wireShader)
{
_wireShader->addSurface(_renderableBox, _renderEntity);
}
}

void NullModelNode::onRemoveFromScene(scene::IMapRootNode& root)
{
Node::onRemoveFromScene(root);
Expand Down
1 change: 0 additions & 1 deletion radiantcore/model/NullModelNode.h
Expand Up @@ -56,7 +56,6 @@ class NullModelNode final :
// Bounded implementation
const AABB& localAABB() const override;

void onInsertIntoScene(scene::IMapRootNode& root) override;
void onRemoveFromScene(scene::IMapRootNode& root) override;

protected:
Expand Down
20 changes: 18 additions & 2 deletions radiantcore/model/StaticModelNode.cpp
Expand Up @@ -40,6 +40,14 @@ void StaticModelNode::onRemoveFromScene(scene::IMapRootNode& root)
{
_model->disconnectUndoSystem(root.getUndoSystem());

if (_renderEntity)
{
for (auto& surface : _renderableSurfaces)
{
_renderEntity->removeSurface(surface);
}
}

_renderableSurfaces.clear();

Node::onRemoveFromScene(root);
Expand Down Expand Up @@ -128,6 +136,11 @@ void StaticModelNode::detachFromShaders()
for (auto& surface : _renderableSurfaces)
{
surface->detach();

if (_renderEntity)
{
_renderEntity->removeSurface(surface);
}
}

_attachedToShaders = false;
Expand All @@ -147,10 +160,13 @@ void StaticModelNode::attachToShaders()
auto shader = renderSystem->capture(surface->getSurface().getActiveMaterial());

// Solid mode
surface->attachToShader(shader, _renderEntity);
surface->attachToShader(shader);

// For orthoview rendering we need the entity's wireframe shader
surface->attachToShader(_renderEntity->getWireShader(), _renderEntity);
surface->attachToShader(_renderEntity->getWireShader());

// Attach to the render entity for lighting mode rendering
_renderEntity->addSurface(surface);
}

_attachedToShaders = true;
Expand Down
4 changes: 2 additions & 2 deletions radiantcore/model/md5/MD5ModelNode.cpp
Expand Up @@ -160,10 +160,10 @@ void MD5ModelNode::attachToShaders()
for (auto& surface : _renderableSurfaces)
{
auto shader = renderSystem->capture(surface->getSurface().getActiveMaterial());
surface->attachToShader(shader, _renderEntity);
surface->attachToShader(shader);

// For orthoview rendering we need the entity's wireframe shader
surface->attachToShader(_renderEntity->getWireShader(), _renderEntity);
surface->attachToShader(_renderEntity->getWireShader());
}

_attachedToShaders = true;
Expand Down
4 changes: 2 additions & 2 deletions radiantcore/rendersystem/backend/OpenGLShader.cpp
Expand Up @@ -166,9 +166,9 @@ void OpenGLShader::renderGeometry(IGeometryRenderer::Slot slot)
_geometryRenderer.renderGeometry(slot);
}

ISurfaceRenderer::Slot OpenGLShader::addSurface(IRenderableSurface& surface, IRenderEntity* entity)
ISurfaceRenderer::Slot OpenGLShader::addSurface(IRenderableSurface& surface)
{
return _surfaceRenderer.addSurface(surface, entity);
return _surfaceRenderer.addSurface(surface);
}

void OpenGLShader::removeSurface(ISurfaceRenderer::Slot slot)
Expand Down
2 changes: 1 addition & 1 deletion radiantcore/rendersystem/backend/OpenGLShader.h
Expand Up @@ -111,7 +111,7 @@ class OpenGLShader :
const std::vector<unsigned int>& indices) override;
void renderGeometry(IGeometryRenderer::Slot slot) override;

ISurfaceRenderer::Slot addSurface(IRenderableSurface& surface, IRenderEntity* entity) override;
ISurfaceRenderer::Slot addSurface(IRenderableSurface& surface) override;
void removeSurface(ISurfaceRenderer::Slot slot) override;
void updateSurface(ISurfaceRenderer::Slot slot) override;
void renderSurface(ISurfaceRenderer::Slot slot) override;
Expand Down
2 changes: 1 addition & 1 deletion radiantcore/rendersystem/backend/SurfaceRenderer.h
Expand Up @@ -149,7 +149,7 @@ class SurfaceRenderer :
return _surfaces.empty();
}

Slot addSurface(IRenderableSurface& surface, IRenderEntity* entity) override
Slot addSurface(IRenderableSurface& surface) override
{
// Find a free slot
auto newSlotIndex = getNextFreeSlotIndex();
Expand Down

0 comments on commit 6822fcc

Please sign in to comment.