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

Revision 2795, 2.5 KB checked in by mattausch, 16 years ago (diff)
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        ///////////
97        //-- post process nodes
98
99        bvh->PostProcess();
100       
101        const int trianglesPerVirtualLeaves = 1000;
102        // set virtual leaves for specified number of triangles
103        bvh->SetVirtualLeaves(trianglesPerVirtualLeaves);
104
105        bvh->UpdateNumLeaves(bvh->mRoot);
106        // compute unique ids
107        bvh->ComputeIds();
108        // specify bounds for occlusion tests
109        bvh->RecomputeBounds();
110        // compute and print stats
111        bvh->ComputeBvhStats();
112        bvh->PrintBvhStats();
113
114        return bvh;
115}
116
117
118}
Note: See TracBrowser for help on using the repository browser.