History

Added new display mode to show culled faces. More statistics.

matsukaze committed 12 years ago

Commit 98411071 parent 52290262 files · +66 −67Browse files

Showing the changes to interface/src/VoxelSystem.cpp (1 of 2 files). Show all

Unified · Split

interface/src/VoxelSystem.cpp+64−67
@@ -60,6 +60,7 @@ VoxelSystem::VoxelSystem(float treeScale, int maxVoxels) · 59 unmodified lines
6060 _treeScale(treeScale),
6161 _maxVoxels(maxVoxels),
6262 _initialized(false),
63+ _showCulledSharedFaces(false),
6364 _usePrimitiveRenderer(false),
6465 _renderer(0) {
6566
@@ -350,8 +351,7 @@ void VoxelSystem::cleanupVoxelMemory() { · 284 unmodified lines
350351
351352 _writeVoxelShaderData = _readVoxelShaderData = NULL;
352353
353− } else
354− if (! _usePrimitiveRenderer) {
354+ } else {
355355 // Destroy glBuffers
356356 glDeleteBuffers(1, &_vboVerticesID);
357357 glDeleteBuffers(1, &_vboColorsID);
@@ -373,10 +373,8 @@ void VoxelSystem::cleanupVoxelMemory() { · 15 unmodified lines
373373 _readColorsArray = NULL;
374374 _writeColorsArray = NULL;
375375 }
376− else {
377− delete _renderer;
378− _renderer = 0;
379− }
376+ delete _renderer;
377+ _renderer = 0;
380378 delete[] _writeVoxelDirtyArray;
381379 delete[] _readVoxelDirtyArray;
382380 _writeVoxelDirtyArray = _readVoxelDirtyArray = NULL;
@@ -461,8 +459,7 @@ void VoxelSystem::initVoxelMemory() { · 78 unmodified lines
461459
462460 _readVoxelShaderData = new VoxelShaderVBOData[_maxVoxels];
463461 _memoryUsageRAM += (sizeof(VoxelShaderVBOData) * _maxVoxels);
464− } else
465− if (! _usePrimitiveRenderer) {
462+ } else {
466463
467464 // Global Normals mode uses a technique of not including normals on any voxel vertices, and instead
468465 // rendering the voxel faces in 6 passes that use a global call to glNormal3f()
@@ -525,27 +522,7 @@ void VoxelSystem::initVoxelMemory() { · 56 unmodified lines
525522 _shadowMapProgram.release();
526523 }
527524 }
528− else {
529− _renderer = new PrimitiveRenderer(_maxVoxels);
530− // create our simple fragment shader if we're the first system to init
531− if (!_perlinModulateProgram.isLinked()) {
532− switchToResourcesParentIfRequired();
533− _perlinModulateProgram.addShaderFromSourceFile(QGLShader::Vertex, "resources/shaders/perlin_modulate.vert");
534− _perlinModulateProgram.addShaderFromSourceFile(QGLShader::Fragment, "resources/shaders/perlin_modulate.frag");
535− _perlinModulateProgram.link();
536−
537− _perlinModulateProgram.bind();
538− _perlinModulateProgram.setUniformValue("permutationNormalTexture", 0);
539− _perlinModulateProgram.release();
540−
541− _shadowMapProgram.addShaderFromSourceFile(QGLShader::Fragment, "resources/shaders/shadow_map.frag");
542− _shadowMapProgram.link();
543−
544− _shadowMapProgram.bind();
545− _shadowMapProgram.setUniformValue("shadowMap", 0);
546− _shadowMapProgram.release();
547− }
548− }
525+ _renderer = new PrimitiveRenderer(_maxVoxels);
549526
550527 _initialized = true;
551528
@@ -690,12 +667,9 @@ void VoxelSystem::setupNewVoxelsForDrawing() { · 138 unmodified lines
690667
691668 if (_writeRenderFullVBO) {
692669 if (_usePrimitiveRenderer) {
693− delete _renderer;
694− _renderer = new PrimitiveRenderer(_maxVoxels);
695− }
696− else {
697− clearFreeBufferIndexes();
670+ _renderer->release();
698671 }
672+ clearFreeBufferIndexes();
699673 }
700674 _voxelsUpdated = newTreeToArrays(_tree->getRoot());
701675 _tree->clearDirtyBit(); // after we pull the trees into the array, we can consider the tree clean
@@ -851,7 +825,8 @@ void VoxelSystem::cleanupRemovedVoxels() { · 149 unmodified lines
851825 // we also might have VBO slots that have been abandoned, if too many of our VBO slots
852826 // are abandonded we want to rerender our full VBOs
853827 const float TOO_MANY_ABANDONED_RATIO = 0.5f;
854− if (!_writeRenderFullVBO && (_abandonedVBOSlots > (_voxelsInWriteArrays * TOO_MANY_ABANDONED_RATIO))) {
828+ if (!_usePrimitiveRenderer && !_writeRenderFullVBO &&
829+ (_abandonedVBOSlots > (_voxelsInWriteArrays * TOO_MANY_ABANDONED_RATIO))) {
855830 if (Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings)) {
856831 qDebug() << "cleanupRemovedVoxels().. _abandonedVBOSlots ["
857832 << _abandonedVBOSlots << "] > TOO_MANY_ABANDONED_RATIO";
@@ -1054,12 +1029,17 @@ int VoxelSystem::updateNodeInArrays(VoxelTreeElement* node, bool reuseIndex, boo · 196 unmodified lines
10541029 node->setVoxelSystem(this);
10551030 }
10561031 inspectForInteriorOcclusionsOperation(node, 0);
1057−
1058− if (node->getInteriorOcclusions() != OctreeElement::HalfSpace::All) {
1032+ unsigned char occlusions;
1033+ if (_showCulledSharedFaces) {
1034+ occlusions = ~node->getInteriorOcclusions();
1035+ } else {
1036+ occlusions = node->getInteriorOcclusions();
1037+ }
1038+ if (occlusions != OctreeElement::HalfSpace::All) {
10591039 Cube* cube = new Cube(
10601040 startVertex.x, startVertex.y, startVertex.z, voxelScale,
10611041 color[RED_INDEX], color[GREEN_INDEX], color[BLUE_INDEX],
1062− node->getInteriorOcclusions());
1042+ occlusions);
10631043 if (cube) {
10641044 primitiveIndex = _renderer->add(cube);
10651045 node->setPrimitiveIndex(primitiveIndex);
@@ -1491,6 +1471,7 @@ void VoxelSystem::killLocalVoxels() { · 425 unmodified lines
14911471 _tree->eraseAllOctreeElements();
14921472 unlockTree();
14931473 clearFreeBufferIndexes();
1474+ _renderer->release();
14941475 _voxelsInReadArrays = 0; // do we need to do this?
14951476 setupNewVoxelsForDrawing();
14961477 }
@@ -1541,7 +1522,7 @@ bool VoxelSystem::inspectForInteriorOcclusionsOperation(OctreeElement* element, · 44 unmodified lines
15411522 // all faces which are completely covered by four child octants.
15421523 unsigned char exteriorOcclusionsA = childA->getExteriorOcclusions();
15431524
1544− if (exteriorOcclusionsA == 0) {
1525+ if (exteriorOcclusionsA == OctreeElement::HalfSpace::None) {
15451526 // There is nothing to be done with this child, next...
15461527 continue;
15471528 }
@@ -1554,7 +1535,7 @@ bool VoxelSystem::inspectForInteriorOcclusionsOperation(OctreeElement* element, · 6 unmodified lines
15541535 // Get child B's occluding faces
15551536 unsigned char exteriorOcclusionsB = childB->getExteriorOcclusions();
15561537
1557− if (exteriorOcclusionsB == 0) {
1538+ if (exteriorOcclusionsB == OctreeElement::HalfSpace::None) {
15581539 // There is nothing to be done with this child, next...
15591540 continue;
15601541 }
@@ -1580,7 +1561,7 @@ bool VoxelSystem::inspectForInteriorOcclusionsOperation(OctreeElement* element, · 19 unmodified lines
15801561
15811562 // Inform the child
15821563 childA->setInteriorOcclusions(occludedSharedFace[i]);
1583− if (occludedSharedFace[i]) {
1564+ if (occludedSharedFace[i] != OctreeElement::HalfSpace::None) {
15841565 //const glm::vec3& v = voxel->getCorner();
15851566 //float s = voxel->getScale();
15861567
@@ -1630,7 +1611,7 @@ bool VoxelSystem::inspectForExteriorOcclusionsOperation(OctreeElement* element, · 43 unmodified lines
16301611 {
16311612 // Derive the exterior occlusions of the voxel elements from the exclusions
16321613 // of its children
1633− unsigned char exteriorOcclusions = 0;
1614+ unsigned char exteriorOcclusions = OctreeElement::HalfSpace::None;
16341615 for (int i = 6; --i >= 0; ) {
16351616 if (exteriorOcclusionsCt[i] == 4) {
16361617
@@ -1653,7 +1634,7 @@ bool VoxelSystem::inspectForExteriorOcclusionsOperation(OctreeElement* element, · 16 unmodified lines
16531634 // occupied. Hence, the subtree from this node could be
16541635 // pruned and replaced by a leaf voxel, if the visible
16551636 // properties of the children are the same
1656− } else if (exteriorOcclusions) {
1637+ } else if (exteriorOcclusions != OctreeElement::HalfSpace::None) {
16571638 //const glm::vec3& v = voxel->getCorner();
16581639 //float s = voxel->getScale();
16591640
@@ -1675,11 +1656,11 @@ bool VoxelSystem::clearOcclusionsOperation(OctreeElement* element, void* extraDa · 15 unmodified lines
16751656 voxel->setExteriorOcclusions(OctreeElement::HalfSpace::All);
16761657
16771658 // And the sibling occluders
1678− voxel->setInteriorOcclusions(0);
1659+ voxel->setInteriorOcclusions(OctreeElement::HalfSpace::None);
16791660 rc = false;
16801661 } else {
1681− voxel->setExteriorOcclusions(0);
1682− voxel->setInteriorOcclusions(0);
1662+ voxel->setExteriorOcclusions(OctreeElement::HalfSpace::None);
1663+ voxel->setInteriorOcclusions(OctreeElement::HalfSpace::None);
16831664 rc = true;
16841665 }
16851666
@@ -1690,10 +1671,9 @@ void VoxelSystem::cullSharedFaces() { · 4 unmodified lines
16901671 _nodeCount = 0;
16911672
16921673 if (Menu::getInstance()->isOptionChecked(MenuOption::CullSharedFaces)) {
1693− cleanupVoxelMemory();
16941674 _useVoxelShader = false;
16951675 _usePrimitiveRenderer = true;
1696− initVoxelMemory();
1676+ _renderer->release();
16971677 clearAllNodesBufferIndex();
16981678 lockTree();
16991679 _tree->recurseTreeWithPostOperation(inspectForExteriorOcclusionsOperation);
@@ -1706,9 +1686,8 @@ void VoxelSystem::cullSharedFaces() { · 6 unmodified lines
17061686 unlockTree();
17071687 qDebug("culling shared faces in %d nodes", _nodeCount);
17081688 } else {
1709− cleanupVoxelMemory();
17101689 _usePrimitiveRenderer = false;
1711− initVoxelMemory();
1690+ _renderer->release();
17121691 clearAllNodesBufferIndex();
17131692 lockTree();
17141693 _tree->recurseTreeWithOperation(clearOcclusionsOperation);
@@ -1723,6 +1702,18 @@ void VoxelSystem::cullSharedFaces() { · 8 unmodified lines
17231702
17241703 }
17251704
1705+void VoxelSystem::showCulledSharedFaces() {
1706+
1707+ if (Menu::getInstance()->isOptionChecked(MenuOption::ShowCulledSharedFaces)) {
1708+ _showCulledSharedFaces = true;
1709+ } else {
1710+ _showCulledSharedFaces = false;
1711+ }
1712+ if (Menu::getInstance()->isOptionChecked(MenuOption::CullSharedFaces)) {
1713+ cullSharedFaces();
1714+ }
1715+}
1716+
17261717 bool VoxelSystem::forceRedrawEntireTreeOperation(OctreeElement* element, void* extraData) {
17271718 _nodeCount++;
17281719 element->setDirtyBit();
@@ -2650,31 +2641,37 @@ void VoxelSystem::collectStatsForTreesAndVBOs() { · 921 unmodified lines
26502641 qDebug("Local Voxel Tree Statistics:\n total nodes %ld \n leaves %ld \n dirty %ld \n colored %ld \n shouldRender %ld \n",
26512642 args.totalNodes, args.leafNodes, args.dirtyNodes, args.coloredNodes, args.shouldRenderNodes);
26522643
2653− qDebug(" _voxelsDirty=%s \n _voxelsInWriteArrays=%ld \n minDirty=%ld \n maxDirty=%ld", debug::valueOf(_voxelsDirty),
2654− _voxelsInWriteArrays, minDirty, maxDirty);
2644+ if (!_usePrimitiveRenderer) {
2645+ qDebug(" _voxelsDirty=%s \n _voxelsInWriteArrays=%ld \n minDirty=%ld \n maxDirty=%ld", debug::valueOf(_voxelsDirty),
2646+ _voxelsInWriteArrays, minDirty, maxDirty);
26552647
2656− qDebug(" inVBO %ld \n nodesInVBOOverExpectedMax %ld \n duplicateVBOIndex %ld \n nodesInVBONotShouldRender %ld",
2657− args.nodesInVBO, args.nodesInVBOOverExpectedMax, args.duplicateVBOIndex, args.nodesInVBONotShouldRender);
2648+ qDebug(" inVBO %ld \n nodesInVBOOverExpectedMax %ld \n duplicateVBOIndex %ld \n nodesInVBONotShouldRender %ld",
2649+ args.nodesInVBO, args.nodesInVBOOverExpectedMax, args.duplicateVBOIndex, args.nodesInVBONotShouldRender);
26582650
2659− qDebug(" inPrimitiveRenderer %ld \n completely culled %ld \n",
2660− args.nodesInPrimitiveRenderer, args.culledLeafNodes);
2651+ qDebug(" memory usage %ld \n gpu memory usage %ld \n", _memoryUsageRAM, _memoryUsageVBO);
26612652
2662− glBufferIndex minInVBO = GLBUFFER_INDEX_UNKNOWN;
2663− glBufferIndex maxInVBO = 0;
2653+ glBufferIndex minInVBO = GLBUFFER_INDEX_UNKNOWN;
2654+ glBufferIndex maxInVBO = 0;
26642655
2665− for (glBufferIndex i = 0; i < _maxVoxels; i++) {
2666− if (args.hasIndexFound[i]) {
2667− minInVBO = std::min(minInVBO,i);
2668− maxInVBO = std::max(maxInVBO,i);
2656+ for (glBufferIndex i = 0; i < _maxVoxels; i++) {
2657+ if (args.hasIndexFound[i]) {
2658+ minInVBO = std::min(minInVBO,i);
2659+ maxInVBO = std::max(maxInVBO,i);
2660+ }
26692661 }
2670− }
26712662
2672− qDebug(" minInVBO=%ld \n maxInVBO=%ld \n _voxelsInWriteArrays=%ld \n _voxelsInReadArrays=%ld",
2673− minInVBO, maxInVBO, _voxelsInWriteArrays, _voxelsInReadArrays);
2663+ qDebug(" minInVBO=%ld \n maxInVBO=%ld \n _voxelsInWriteArrays=%ld \n _voxelsInReadArrays=%ld",
2664+ minInVBO, maxInVBO, _voxelsInWriteArrays, _voxelsInReadArrays);
26742665
2675− qDebug(" _freeIndexes.size()=%ld",
2676− _freeIndexes.size());
2666+ qDebug(" _freeIndexes.size()=%ld",
2667+ _freeIndexes.size());
2668+ } else {
2669+ qDebug(" PrimitiveRenderer nodes %ld \n completely culled nodes %ld \n",
2670+ args.nodesInPrimitiveRenderer, args.culledLeafNodes);
26772671
2672+ qDebug(" memory usage %ld \n gpu memory usage %ld \n",
2673+ _renderer->getMemoryUsage(), _renderer->getMemoryUsageGPU());
2674+ }
26782675 qDebug("DONE WITH Local Voxel Tree Statistics >>>>>>>>>>>>");
26792676 }
26802677