00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00043 #include "vector.h"
00044 #include "forward.h"
00045
00046
00047
00048
00049
00050
00051
00052 #ifndef OMICRON_OCTREE_TYPES_DEFINED
00053 #define OMICRON_OCTREE_TYPES_DEFINED
00054
00055 template <class T>
00056 class octree_c
00058 {
00059 protected:
00060
00061 #if !defined(__GNUG__)
00062 template <class T>
00063 #endif
00064 struct node_t
00066 {
00067 list_c<T> *data;
00068 struct node_t *subnodes[8];
00069 vec3_t min, max;
00070 vec3_t pts[8];
00071 };
00072
00073 node_t<T> root;
00074
00075 node_t<T> *
00076 create_node
00077 (node_t<T> *node, ulong num);
00078
00079 slong
00080 get_subnode_num_vec
00081 (node_t<T> *node, vec3_t p);
00082
00083 slong
00084 get_subnode_num
00085 (node_t<T> *node, vec3_t mn, vec3_t mx);
00086
00087 void
00088 add_to_subnode
00089 (node_t<T> *node, T *d, vec3_t mn, vec3_t mx);
00090
00091 slong
00092 get_visibility
00096 (node_t<T> *node);
00097
00098 void
00099 add_complete_node_to_array
00100 (node_t<T> *node, array_c<T> &list);
00101
00102 void
00103 add_node_to_array
00104 (node_t<T> *node, array_c<T> &list);
00105
00106 void
00107 remove_node
00108 (node_t<T> *node);
00109
00110 public:
00111
00112 vec3_c viewmin, viewmax;
00113
00114 octree_c();
00115 virtual ~octree_c();
00116
00117 void
00118 set_extents(vec3_t mn, vec3_t mx)
00119 {
00120 AssertThis;
00121
00122 vector_copy(mn, root.min);
00123 vector_copy(mx, root.max);
00124 }
00125
00126 void
00127 add(T *d, vec3_t mn, vec3_t mx);
00128
00129 void
00130 remove(T *d);
00131
00132 void
00133 get_visible(array_c<T> &list);
00134
00135 void
00136 update_view();
00137 };
00138
00139 #endif
00140