-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoctree.h
178 lines (136 loc) · 2.7 KB
/
octree.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include "raytracer.h"
#ifndef _OCTREE_
#define _OCTREE_
#include <iostream>
#include <cmath>
//forward declarations
class Octree;
class List;
class ListNode;
//class for a List node, points to an object and the next node in the list
class ListNode {
public:
ListNode(){
object = NULL;
next = NULL;
}
ListNode(SceneDagNode * node){
object = node;
next= NULL;
}
SceneDagNode * getObject(){
return object;
}
ListNode * getNext(){
return next;
}
void setNext(ListNode * _next){
next = _next;
}
void setObject(SceneDagNode * obj){
object = obj;
}
private:
SceneDagNode * object;
ListNode * next;
};
//class for a list, head points to first item in list
class List {
public:
List(){
head = NULL;
}
ListNode * getHead(){
return head;
}
void setHead(ListNode* _head){
head = _head;
}
void addNode (SceneDagNode * newNode) {
ListNode * temp;
if (head == NULL){
head = new ListNode(newNode);
head->setObject(newNode);
} else {
temp = head;
while (temp->getNext() != NULL ){
temp = temp->getNext();
}
ListNode * temp2 = new ListNode(newNode);
temp2->setObject(newNode);
temp->setNext(temp2);
}
}
private:
ListNode * head;
};
//class for hash table entry
//contains a list of objects that intersect as well as dimensions in world space
class HashEntry {
public:
HashEntry(int parentID, int newID, double parentDims[6]);
double subdivide(Octree * octree, List * parentList, int depth, double sideLen);
int getID(){
return ID;
}
int getSubdivided(){
return subdivided;
}
int getListSize(){
return listSize;
}
List * getList(){
return objectList;
}
double * getDims(){
return dims;
}
void increaseListSize(){
listSize++;
}
void addNode (SceneDagNode * newNode) {
ListNode * temp;
ListNode * temp2;
if (objectList->getHead() == NULL){
temp2 = new ListNode(newNode);
temp2->setObject(newNode);
objectList->setHead(temp2);
} else {
temp = objectList->getHead();
while (temp->getNext() != NULL ){
temp = temp->getNext();
}
temp2 = new ListNode(newNode);
temp2->setObject(newNode);
temp->setNext(temp2);
}
}
private:
int ID;
bool subdivided;
int listSize;
List * objectList;
//dims[0] = min_x, dims[1] = max_x, dims[2] = min_y, you get the idea
double dims[6];
//never use these! for hash table collision
HashEntry * prev;
HashEntry * next;
};
//class for an octree
//basically just a hash table
class Octree {
public:
Octree();
int addEntry(HashEntry * newEntry, List * parentList);
HashEntry * findEntry(int ID);
int getNumEntries(){
return numEntries;
}
void setNumEntries(int num){
numEntries = num;
}
private:
int numEntries;
HashEntry ** hashTable;
};
#endif