History

Filter terrain, points, spanners by frustum intersection.

Andrzej Kapolka committed 12 years ago

Commit 46d41721 parent c11b7394 files · +45 −6Browse files

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

Unified · Split

interface/src/MetavoxelSystem.cpp+36−2
@@ -108,6 +108,12 @@ int RenderVisitor::visit(MetavoxelInfo& info) { · 107 unmodified lines
108108 }
109109
110110 void MetavoxelSystem::render() {
111+ // update the frustum
112+ ViewFrustum* viewFrustum = Application::getInstance()->getViewFrustum();
113+ _frustum.set(viewFrustum->getFarTopLeft(), viewFrustum->getFarTopRight(), viewFrustum->getFarBottomLeft(),
114+ viewFrustum->getFarBottomRight(), viewFrustum->getNearTopLeft(), viewFrustum->getNearTopRight(),
115+ viewFrustum->getNearBottomLeft(), viewFrustum->getNearBottomRight());
116+
111117 RenderVisitor renderVisitor(getLOD());
112118 guideToAugmented(renderVisitor);
113119 }
@@ -628,13 +634,31 @@ public: · 514 unmodified lines
628634
629635 SpannerRenderVisitor(const MetavoxelLOD& lod);
630636
637+ virtual int visit(MetavoxelInfo& info);
631638 virtual bool visit(Spanner* spanner, const glm::vec3& clipMinimum, float clipSize);
639+
640+private:
641+
642+ int _containmentDepth;
632643 };
633644
634645 SpannerRenderVisitor::SpannerRenderVisitor(const MetavoxelLOD& lod) :
635646 SpannerVisitor(QVector<AttributePointer>() << AttributeRegistry::getInstance()->getSpannersAttribute(),
636647 QVector<AttributePointer>(), QVector<AttributePointer>(), QVector<AttributePointer>(),
637− lod, encodeOrder(Application::getInstance()->getViewFrustum()->getDirection())) {
648+ lod, encodeOrder(Application::getInstance()->getViewFrustum()->getDirection())),
649+ _containmentDepth(INT_MAX) {
650+}
651+
652+int SpannerRenderVisitor::visit(MetavoxelInfo& info) {
653+ if (_containmentDepth >= _depth) {
654+ Frustum::IntersectionType intersection = Application::getInstance()->getMetavoxels()->getFrustum().getIntersectionType(
655+ info.getBounds());
656+ if (intersection == Frustum::NO_INTERSECTION) {
657+ return STOP_RECURSION;
658+ }
659+ _containmentDepth = (intersection == Frustum::CONTAINS_INTERSECTION) ? _depth : INT_MAX;
660+ }
661+ return SpannerVisitor::visit(info);
638662 }
639663
640664 bool SpannerRenderVisitor::visit(Spanner* spanner, const glm::vec3& clipMinimum, float clipSize) {
@@ -652,14 +676,24 @@ public: · 11 unmodified lines
652676 private:
653677
654678 int _order;
679+ int _containmentDepth;
655680 };
656681
657682 BufferRenderVisitor::BufferRenderVisitor(const AttributePointer& attribute, const MetavoxelLOD& lod) :
658683 MetavoxelVisitor(QVector<AttributePointer>() << attribute, QVector<AttributePointer>(), lod),
659− _order(encodeOrder(Application::getInstance()->getViewFrustum()->getDirection())) {
684+ _order(encodeOrder(Application::getInstance()->getViewFrustum()->getDirection())),
685+ _containmentDepth(INT_MAX) {
660686 }
661687
662688 int BufferRenderVisitor::visit(MetavoxelInfo& info) {
689+ if (_containmentDepth >= _depth) {
690+ Frustum::IntersectionType intersection = Application::getInstance()->getMetavoxels()->getFrustum().getIntersectionType(
691+ info.getBounds());
692+ if (intersection == Frustum::NO_INTERSECTION) {
693+ return STOP_RECURSION;
694+ }
695+ _containmentDepth = (intersection == Frustum::CONTAINS_INTERSECTION) ? _depth : INT_MAX;
696+ }
663697 BufferDataPointer buffer = info.inputValues.at(0).getInlineValue<BufferDataPointer>();
664698 if (buffer) {
665699 buffer->render();