source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/BvhLoader.cpp @ 2800

Revision 2800, 2.5 KB checked in by mattausch, 16 years ago (diff)

friendly culling debug version with timers, no materials

Line 
1#include <queue>
2#include <stack>
3#include <fstream>
4#include <iostream>
5
6#include "BvhLoader.h"
7#include "gzstream.h"
8
9
10namespace CHCDemoEngine
11{
12
13using namespace std;
14
15
16#define TYPE_INTERIOR -2
17#define TYPE_LEAF -3
18
19
20
21BvhNode *BvhLoader::LoadNextNode(igzstream &stream, BvhInterior *parent)
22{
23        int nodeType;
24        stream.read(reinterpret_cast<char *>(&nodeType), sizeof(int));
25
26        BvhNode *node;
27
28        if (nodeType == TYPE_LEAF)
29                node = new BvhLeaf(parent);
30        else if (nodeType == TYPE_INTERIOR)
31                node = new BvhInterior(parent);
32        else
33                cerr << "error: wrong node type: " << nodeType << endl;
34               
35
36        Vector3 bMin, bMax;
37
38        stream.read(reinterpret_cast<char *>(&(node->mFirst)), sizeof(int));
39        stream.read(reinterpret_cast<char *>(&(node->mLast)), sizeof(int));
40
41        stream.read(reinterpret_cast<char *>(&bMin), sizeof(Vector3));
42        stream.read(reinterpret_cast<char *>(&bMax), sizeof(Vector3));
43
44        node->mBox = AxisAlignedBox3(bMin, bMax);
45        node->mArea = node->mBox.SurfaceArea();
46
47        //cout << "box: " << node->mBox << " area: " << node->mArea << endl;
48       
49        return node;
50}
51
52
53Bvh *BvhLoader::Load(const string &filename, 
54                                         const SceneEntityContainer &entities)
55{
56        queue<BvhNode *> tQueue;
57        igzstream stream(filename.c_str());
58
59        if (!stream.is_open()) return NULL;
60
61        cout << "loading bvh" << endl;
62
63        Bvh *bvh = new Bvh(entities);
64        bvh->mRoot = LoadNextNode(stream, NULL);
65
66        tQueue.push(bvh->mRoot);
67        bvh->mNumNodes = 1;
68
69        while(!tQueue.empty())
70        {
71                BvhNode *node = tQueue.front();
72                tQueue.pop();
73
74                if (!node->IsLeaf())
75                {
76                        bvh->mNumNodes += 2;
77
78                        BvhInterior *interior = static_cast<BvhInterior *>(node);
79
80                        BvhNode *front = LoadNextNode(stream, interior);
81                        BvhNode *back = LoadNextNode(stream, interior);
82
83                        interior->mFront = front;
84                        interior->mBack = back;
85
86                        front->mDepth = interior->mDepth + 1;
87                        back->mDepth = interior->mDepth + 1;
88
89                        tQueue.push(front);                     
90                        tQueue.push(back);
91                }
92        }
93
94        cout << "... finished loading " << bvh->mNumNodes << " nodes, updating boxes" << endl;
95
96        bvh->mBox = bvh->mRoot->GetBox();
97
98        cout << "scene box: " << bvh->mBox << endl;
99
100        ///////////
101        //-- post process nodes
102
103        bvh->PostProcess();
104       
105        // set virtual leaves for specified number of triangles
106        bvh->SetVirtualLeaves(INITIAL_TRIANGLES_PER_VIRTUAL_LEAVES);
107
108        bvh->UpdateNumLeaves(bvh->mRoot);
109        // compute unique ids
110        bvh->ComputeIds();
111        // specify bounds for occlusion tests
112        bvh->RecomputeBounds();
113        // compute and print stats
114        bvh->ComputeBvhStats();
115        bvh->PrintBvhStats();
116
117        return bvh;
118}
119
120
121}
Note: See TracBrowser for help on using the repository browser.