Skip to content

Commit

Permalink
#5584: Pass the volume test reference to the backend renderer, it sho…
Browse files Browse the repository at this point in the history
…uld be used to cull surfaces.
  • Loading branch information
codereader committed Jan 14, 2022
1 parent 9448c35 commit d20e29c
Show file tree
Hide file tree
Showing 12 changed files with 34 additions and 25 deletions.
7 changes: 6 additions & 1 deletion include/irender.h
@@ -1,6 +1,7 @@
#pragma once

#include "imodule.h"
#include "ivolumetest.h"
#include "iwindingrenderer.h"
#include "igeometryrenderer.h"
#include "isurfacerenderer.h"
Expand Down Expand Up @@ -546,12 +547,16 @@ class RenderSystem
*
* \param viewer
* Location of the viewer in world space.
*
* * \param volume
* The volume structure that can be used for culling.
*/
virtual void render(RenderViewType renderViewType,
RenderStateFlags globalFlagsMask,
const Matrix4& modelview,
const Matrix4& projection,
const Vector3& viewer) = 0;
const Vector3& viewer,
const VolumeTest& volume) = 0;

virtual void realise() = 0;
virtual void unrealise() = 0;
Expand Down
4 changes: 2 additions & 2 deletions libs/wxutil/preview/RenderPreview.cpp
Expand Up @@ -500,7 +500,7 @@ bool RenderPreview::drawPreview()

// Launch the back end rendering
renderer.submitToShaders();
_renderSystem->render(RenderViewType::Camera, flags, _volumeTest.GetModelview(), projection, _viewOrigin);
_renderSystem->render(RenderViewType::Camera, flags, _volumeTest.GetModelview(), projection, _viewOrigin, _volumeTest);

// Give subclasses an opportunity to render their own on-screen stuff
onPostRender();
Expand All @@ -525,7 +525,7 @@ void RenderPreview::renderWireFrame()

// Launch the back end rendering
renderer.submitToShaders();
_renderSystem->render(RenderViewType::Camera, flags, _volumeTest.GetModelview(), projection, _viewOrigin);
_renderSystem->render(RenderViewType::Camera, flags, _volumeTest.GetModelview(), projection, _viewOrigin, _volumeTest);
}

void RenderPreview::onGLMouseClick(wxMouseEvent& ev)
Expand Down
2 changes: 1 addition & 1 deletion radiant/camera/CamWnd.cpp
Expand Up @@ -807,7 +807,7 @@ void CamWnd::Cam_Draw()
getCameraSettings()->getRenderMode() == RENDER_MODE_LIGHTING
);
GlobalRenderSystem().render(RenderViewType::Camera, allowedRenderFlags,
_camera->getModelView(), _camera->getProjection(), _view.getViewer());
_camera->getModelView(), _camera->getProjection(), _view.getViewer(), _view);

_renderer->cleanup();
}
Expand Down
4 changes: 2 additions & 2 deletions radiant/xyview/XYRenderer.h
Expand Up @@ -122,8 +122,8 @@ class XYRenderer :
}
}

void render(const Matrix4& modelview, const Matrix4& projection)
void render(const Matrix4& modelview, const Matrix4& projection, const VolumeTest& view)
{
GlobalRenderSystem().render(RenderViewType::OrthoView, _globalstate, modelview, projection, Vector3(0,0,0));
GlobalRenderSystem().render(RenderViewType::OrthoView, _globalstate, modelview, projection, Vector3(0,0,0), view);
}
}; // class XYRenderer
2 changes: 1 addition & 1 deletion radiant/xyview/XYWnd.cpp
Expand Up @@ -1389,7 +1389,7 @@ void XYWnd::draw()
}

// Second pass (GL calls)
renderer.render(_modelView, _projection);
renderer.render(_modelView, _projection, _view);
}

glDepthMask(GL_FALSE);
Expand Down
5 changes: 3 additions & 2 deletions radiantcore/rendersystem/OpenGLRenderSystem.cpp
Expand Up @@ -121,7 +121,8 @@ void OpenGLRenderSystem::render(RenderViewType renderViewType,
RenderStateFlags globalstate,
const Matrix4& modelview,
const Matrix4& projection,
const Vector3& viewer)
const Vector3& viewer,
const VolumeTest& view)
{
glPushAttrib(GL_ALL_ATTRIB_BITS);

Expand Down Expand Up @@ -214,7 +215,7 @@ void OpenGLRenderSystem::render(RenderViewType renderViewType,

if (pair.second->isApplicableTo(renderViewType))
{
pair.second->render(current, globalstate, viewer, _time);
pair.second->render(current, globalstate, viewer, view, _time);
}

pair.second->clearRenderables();
Expand Down
7 changes: 4 additions & 3 deletions radiantcore/rendersystem/OpenGLRenderSystem.h
Expand Up @@ -63,9 +63,10 @@ class OpenGLRenderSystem

ShaderPtr capture(const std::string& name) override;
void render(RenderViewType renderViewType, RenderStateFlags globalstate,
const Matrix4& modelview,
const Matrix4& projection,
const Vector3& viewer) override;
const Matrix4& modelview,
const Matrix4& projection,
const Vector3& viewer,
const VolumeTest& view) override;
void realise() override;
void unrealise() override;

Expand Down
4 changes: 2 additions & 2 deletions radiantcore/rendersystem/backend/OpenGLShader.cpp
Expand Up @@ -131,7 +131,7 @@ void OpenGLShader::addSurface(const std::vector<ArbitraryMeshVertex>& vertices,
_vertexBuffer->addIndicesToLastBatch(indices.begin(), indices.size(), indexOffset);
}
#endif
void OpenGLShader::drawSurfaces()
void OpenGLShader::drawSurfaces(const VolumeTest& view)
{
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
Expand All @@ -146,7 +146,7 @@ void OpenGLShader::drawSurfaces()
//_vertexBuffer->renderAllBatches(GL_TRIANGLES, false);

_geometryRenderer.render();
_surfaceRenderer.render();
_surfaceRenderer.render(view);
#if 0
// Render all triangles

Expand Down
2 changes: 1 addition & 1 deletion radiantcore/rendersystem/backend/OpenGLShader.h
Expand Up @@ -113,7 +113,7 @@ class OpenGLShader final :

//void addSurface(const std::vector<ArbitraryMeshVertex>& vertices, const std::vector<unsigned int>& indices) override;
bool hasSurfaces() const;
void drawSurfaces();
void drawSurfaces(const VolumeTest& view);

IGeometryRenderer::Slot addGeometry(GeometryType indexType,
const std::vector<ArbitraryMeshVertex>& vertices, const std::vector<unsigned int>& indices) override;
Expand Down
3 changes: 2 additions & 1 deletion radiantcore/rendersystem/backend/OpenGLShaderPass.cpp
Expand Up @@ -565,6 +565,7 @@ void OpenGLShaderPass::addRenderable(const OpenGLRenderable& renderable,
void OpenGLShaderPass::render(OpenGLState& current,
unsigned int flagsMask,
const Vector3& viewer,
const VolumeTest& view,
std::size_t time)
{
if (!_owner.isVisible()) return;
Expand All @@ -578,7 +579,7 @@ void OpenGLShaderPass::render(OpenGLState& current,
// Apply our state to the current state object
applyState(current, flagsMask, viewer, time, NULL);

_owner.drawSurfaces();
_owner.drawSurfaces(view);

if (!_renderablesWithoutEntity.empty())
{
Expand Down
13 changes: 7 additions & 6 deletions radiantcore/rendersystem/backend/OpenGLShaderPass.h
Expand Up @@ -97,9 +97,9 @@ class OpenGLShaderPass

// Render all of the given TransformedRenderables
void renderAllContained(const Renderables& renderables,
OpenGLState& current,
const Vector3& viewer,
std::size_t time);
OpenGLState& current,
const Vector3& viewer,
std::size_t time);

/* Helper functions to enable/disable particular GL states */

Expand Down Expand Up @@ -187,9 +187,10 @@ class OpenGLShaderPass
*
*/
void render(OpenGLState& current,
unsigned int flagsMask,
const Vector3& viewer,
std::size_t time);
unsigned int flagsMask,
const Vector3& viewer,
const VolumeTest& view,
std::size_t time);

/**
* Returns true if this shaderpass doesn't have anything to render.
Expand Down
6 changes: 3 additions & 3 deletions radiantcore/rendersystem/backend/SurfaceRenderer.h
Expand Up @@ -163,7 +163,7 @@ class SurfaceRenderer :
_surfaces.at(slot).surfaceDataChanged = true;
}

void render()
void render(const VolumeTest& view)
{
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
Expand All @@ -176,7 +176,7 @@ class SurfaceRenderer :

for (auto& surface : _surfaces)
{
renderSlot(surface.second);
renderSlot(surface.second, &view);
}

glDisableClientState(GL_NORMAL_ARRAY);
Expand All @@ -201,7 +201,7 @@ class SurfaceRenderer :
}

private:
void renderSlot(SurfaceInfo& slot)
void renderSlot(SurfaceInfo& slot, const VolumeTest* view = nullptr)
{
auto& surface = slot.surface.get();

Expand Down

0 comments on commit d20e29c

Please sign in to comment.