29 #ifndef OCT_NODE_INCLUDED
30 #define OCT_NODE_INCLUDED
33 # pragma GCC system_header
36 #include "allocator.h"
37 #include "binary_node.h"
38 #include "marching_cubes_poisson.h"
47 template<
class NodeData ,
class Real=
float >
53 class AdjacencyCountFunction
59 template<
class NodeAdjacencyFunction>
60 void __processNodeFaces(
OctNode* node,NodeAdjacencyFunction* F,
int cIndex1,
int cIndex2,
int cIndex3,
int cIndex4);
61 template<
class NodeAdjacencyFunction>
62 void __processNodeEdges(
OctNode* node,NodeAdjacencyFunction* F,
int cIndex1,
int cIndex2);
63 template<
class NodeAdjacencyFunction>
64 void __processNodeNodes(
OctNode* node,NodeAdjacencyFunction* F);
65 template<
class NodeAdjacencyFunction>
66 static void __ProcessNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int cWidth2,NodeAdjacencyFunction* F);
67 template<
class TerminatingNodeAdjacencyFunction>
68 static void __ProcessTerminatingNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int cWidth2,TerminatingNodeAdjacencyFunction* F);
69 template<
class Po
intAdjacencyFunction>
70 static void __ProcessPointAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node2,
int radius2,
int cWidth2,PointAdjacencyFunction* F);
71 template<
class NodeAdjacencyFunction>
72 static void __ProcessFixedDepthNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int cWidth2,
int depth,NodeAdjacencyFunction* F);
73 template<
class NodeAdjacencyFunction>
74 static void __ProcessMaxDepthNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int cWidth2,
int depth,NodeAdjacencyFunction* F);
77 static inline int Overlap(
int c1,
int c2,
int c3,
int dWidth);
78 inline static int ChildOverlap(
int dx,
int dy,
int dz,
int d,
int cRadius2);
80 const OctNode* __faceNeighbor(
int dir,
int off)
const;
81 const OctNode* __edgeNeighbor(
int o,
const int i[2],
const int idx[2])
const;
82 OctNode* __faceNeighbor(
int dir,
int off,
int forceChildren);
83 OctNode* __edgeNeighbor(
int o,
const int i[2],
const int idx[2],
int forceChildren);
94 short d , off[DIMENSION];
102 int depth(
void)
const;
103 static inline void DepthAndOffset(
const long long& index,
int& depth,
int offset[DIMENSION]);
105 static inline int Depth(
const long long& index);
106 static inline void Index(
int depth,
const int offset[3],
short& d,
short off[DIMENSION]);
112 int nodes(
void)
const;
131 template<
class NodeAdjacencyFunction>
133 template<
class NodeAdjacencyFunction>
135 template<
class NodeAdjacencyFunction>
137 template<
class NodeAdjacencyFunction>
140 template<
class NodeAdjacencyFunction>
142 template<
class NodeAdjacencyFunction>
144 template<
class TerminatingNodeAdjacencyFunction>
146 template<
class TerminatingNodeAdjacencyFunction>
148 template<
class Po
intAdjacencyFunction>
150 template<
class Po
intAdjacencyFunction>
152 template<
class NodeAdjacencyFunction>
154 template<
class NodeAdjacencyFunction>
155 static void ProcessFixedDepthNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int width2,
int depth,NodeAdjacencyFunction* F,
int processCurrent=1);
156 template<
class NodeAdjacencyFunction>
158 template<
class NodeAdjacencyFunction>
159 static void ProcessMaxDepthNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int width2,
int depth,NodeAdjacencyFunction* F,
int processCurrent=1);
182 template<
class NodeData2>
185 static inline int Overlap2(
const int &depth1,
const int offSet1[DIMENSION],
const Real& multiplier1,
const int &depth2,
const int offSet2[DIMENSION],
const Real& multiplier2);
188 int write(
const char* fileName)
const;
189 int write(FILE* fp)
const;
190 int read(
const char* fileName);
208 void set(
int depth );
258 void set(
int depth );
271 void set(
int depth );
283 #include "octree_poisson.hpp"