Skip to content

Commit

Permalink
VOXELRENDER: added frustum culling and fixed resolving the region for…
Browse files Browse the repository at this point in the history
… reference nodes
  • Loading branch information
mgerhardy committed Aug 13, 2023
1 parent 51c2f0f commit 95c86a5
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 22 deletions.
49 changes: 36 additions & 13 deletions src/modules/voxelrender/RawVolumeRenderer.cpp
Expand Up @@ -513,19 +513,39 @@ void RawVolumeRenderer::updatePalette(int idx) {
}
}

void RawVolumeRenderer::updateCulling(int idx, const video::Camera &camera) {
if (_state[idx]._hidden) {
_state[idx]._culled = true;
return;
}
const int bufferIndex = resolveIdx(idx);
if (!_state[bufferIndex].hasData()) {
if (_state[bufferIndex]._rawVolume) {
Log::trace("No data, but volume: %i", bufferIndex);
}
_state[idx]._culled = true;
return;
}
_state[idx]._culled = !camera.isVisible(_state[idx]._mins, _state[idx]._maxs);
}

bool RawVolumeRenderer::isVisible(int idx) const {
if (_state[idx]._hidden) {
return false;
}
if (_state[idx]._culled) {
return false;
}
return true;
}

void RawVolumeRenderer::render(RenderContext &renderContext, const video::Camera& camera, bool shadow) {
core_trace_scoped(RawVolumeRendererRender);

bool visible = false;
for (int idx = 0; idx < MAX_VOLUMES; ++idx) {
if (_state[idx]._hidden) {
continue;
}
const int bufferIndex = resolveIdx(idx);
if (!_state[bufferIndex].hasData()) {
if (_state[bufferIndex]._rawVolume) {
Log::trace("No data, but volume: %i", bufferIndex);
}
updateCulling(idx, camera);
if (!isVisible(idx)) {
continue;
}
visible = true;
Expand All @@ -535,7 +555,7 @@ void RawVolumeRenderer::render(RenderContext &renderContext, const video::Camera
}
for (auto& i : _meshes[MeshType_Transparency]) {
for (int idx = 0; idx < MAX_VOLUMES; ++idx) {
if (_state[idx]._hidden) {
if (!isVisible(idx)) {
continue;
}
const int bufferIndex = resolveIdx(idx);
Expand All @@ -562,7 +582,7 @@ void RawVolumeRenderer::render(RenderContext &renderContext, const video::Camera
var.lightviewprojection = lightViewProjection;

for (int idx = 0; idx < MAX_VOLUMES; ++idx) {
if (_state[idx]._hidden) {
if (!isVisible(idx)) {
continue;
}
const int bufferIndex = resolveIdx(idx);
Expand Down Expand Up @@ -613,7 +633,7 @@ void RawVolumeRenderer::render(RenderContext &renderContext, const video::Camera
_paletteHash = 0;
// --- opaque pass
for (int idx = 0; idx < MAX_VOLUMES; ++idx) {
if (_state[idx]._hidden) {
if (!isVisible(idx)) {
continue;
}
const int bufferIndex = resolveIdx(idx);
Expand Down Expand Up @@ -648,7 +668,7 @@ void RawVolumeRenderer::render(RenderContext &renderContext, const video::Camera
sorted.reserve(MAX_VOLUMES);
video::ScopedState scopedBlend(video::State::Blend, true);
for (int idx = 0; idx < MAX_VOLUMES; ++idx) {
if (_state[idx]._hidden) {
if (!isVisible(idx)) {
continue;
}
const int bufferIndex = resolveIdx(idx);
Expand Down Expand Up @@ -704,7 +724,8 @@ void RawVolumeRenderer::render(RenderContext &renderContext, const video::Camera
}
}

bool RawVolumeRenderer::setModelMatrix(int idx, const glm::mat4& model, const glm::vec3 &pivot, bool reset) {
bool RawVolumeRenderer::setModelMatrix(int idx, const glm::mat4 &model, const glm::vec3 &pivot, const glm::vec3 &mins,
const glm::vec3 &maxs) {
if (idx < 0 || idx >= MAX_VOLUMES) {
Log::error("Given id %i is out of bounds", idx);
return false;
Expand All @@ -716,6 +737,8 @@ bool RawVolumeRenderer::setModelMatrix(int idx, const glm::mat4& model, const gl
}
state._model = model;
state._pivot = pivot;
state._mins = mins;
state._maxs = maxs;
return true;
}

Expand Down
12 changes: 9 additions & 3 deletions src/modules/voxelrender/RawVolumeRenderer.h
Expand Up @@ -70,11 +70,14 @@ class RawVolumeRenderer : public core::NonCopyable {
};
struct State {
bool _hidden = false;
bool _culled = false;
bool _gray = false;
int32_t _vertexBufferIndex[MeshType_Max] {-1, -1};
int32_t _indexBufferIndex[MeshType_Max] {-1, -1};
glm::mat4 _model;
glm::vec3 _pivot;
glm::mat4 _model{1.0f};
glm::vec3 _pivot{0.0f};
glm::vec3 _mins{0.0f};
glm::vec3 _maxs{0.0f};
video::Buffer _vertexBuffer[MeshType_Max];
int _reference = -1;
voxel::RawVolume* _rawVolume = nullptr;
Expand Down Expand Up @@ -151,6 +154,8 @@ class RawVolumeRenderer : public core::NonCopyable {
bool updateBufferForVolume(int idx, MeshType type);
void clearMeshes();
void deleteMesh(int idx, MeshType meshType, Meshes &array);
void updateCulling(int idx, const video::Camera &camera);
bool isVisible(int idx) const;

public:
RawVolumeRenderer();
Expand Down Expand Up @@ -197,7 +202,8 @@ class RawVolumeRenderer : public core::NonCopyable {
*/
void setVolumeReference(int idx, int referencedIdx);
void resetReferences();
bool setModelMatrix(int idx, const glm::mat4& model, const glm::vec3 &pivot, bool reset = true);
bool setModelMatrix(int idx, const glm::mat4 &model, const glm::vec3 &pivot, const glm::vec3 &mins,
const glm::vec3 &maxs);

bool empty(int idx = 0) const;
/**
Expand Down
18 changes: 12 additions & 6 deletions src/modules/voxelrender/SceneGraphRenderer.cpp
Expand Up @@ -180,15 +180,18 @@ void SceneGraphRenderer::prepare(const scenegraph::SceneGraph &sceneGraph, scene
}
voxel::RawVolume *v = _renderer.volume(id);
_renderer.setVolume(id, node, true);
const voxel::Region &region = node.region();
if (v != node.volume()) {
_renderer.extractRegion(id, node.region());
_renderer.extractRegion(id, region);
}
if (_sceneMode) {
const scenegraph::SceneGraphTransform &transform = node.transformForFrame(frame);
const glm::vec3 pivot = transform.worldScale() * node.pivot() * glm::vec3(node.region().getDimensionsInVoxels());
_renderer.setModelMatrix(id, transform.worldMatrix(), pivot);
const glm::vec3 maxs = transform.worldMatrix() * glm::vec4(region.getUpperCorner(), 1.0f);
const glm::vec3 mins = transform.worldMatrix() * glm::vec4(region.getLowerCorner(), 1.0f);
const glm::vec3 pivot = transform.worldScale() * node.pivot() * glm::vec3(region.getDimensionsInVoxels());
_renderer.setModelMatrix(id, transform.worldMatrix(), pivot, mins, maxs);
} else {
_renderer.setModelMatrix(id, glm::mat4(1.0f), glm::vec3(0.0f));
_renderer.setModelMatrix(id, glm::mat4(1.0f), glm::vec3(0.0f), region.getLowerCorner(), region.getUpperCorner());
}
if (hideInactive) {
_renderer.hide(id, id != activeNode);
Expand Down Expand Up @@ -216,8 +219,11 @@ void SceneGraphRenderer::prepare(const scenegraph::SceneGraph &sceneGraph, scene
const int referencedId = getVolumeId(node.reference());
_renderer.setVolumeReference(id, referencedId);
const scenegraph::SceneGraphTransform &transform = node.transformForFrame(frame);
const glm::vec3 pivot = transform.worldScale() * node.pivot() * glm::vec3(node.region().getDimensionsInVoxels());
_renderer.setModelMatrix(id, transform.worldMatrix(), pivot);
const voxel::Region region = sceneGraph.resolveRegion(node);
const glm::vec3 maxs = transform.worldMatrix() * glm::vec4(region.getUpperCorner(), 1.0f);
const glm::vec3 mins = transform.worldMatrix() * glm::vec4(region.getLowerCorner(), 1.0f);
const glm::vec3 pivot = transform.worldScale() * sceneGraph.resolvePivot(node) * glm::vec3(region.getDimensionsInVoxels());
_renderer.setModelMatrix(id, transform.worldMatrix(), pivot, mins, maxs);
if (hideInactive) {
_renderer.hide(id, id != activeNode);
} else {
Expand Down

0 comments on commit 95c86a5

Please sign in to comment.