00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VOXTREE_H
00018 #define VOXTREE_H
00019
00020 #include <camvox/Voxel.h>
00021 #include <camvox/VoxOperation.h>
00022 #include <camvox/VoxCoord.h>
00023 #include <camvox/CSGObject.h>
00024 #include <camvox/FreeList.h>
00025
00026 namespace camvox {
00027
00028 typedef struct {
00029 Voxel voxels[8];
00030 } vox_node_t;
00031
00035 class VoxTree {
00036 private:
00037 FreeList free_list;
00038 uint32_t nodes_size;
00039 vox_node_t *nodes;
00040 uint32_t root;
00041 double size;
00042 double scale;
00043
00050 uint32_t alloc(void);
00051
00057 void free(uint32_t node_nr);
00058
00064 void checkSize(void);
00065
00069 Voxel pruneVoxel(uint32_t node_nr, const VoxCoord &coord, int voxel_index);
00070
00074 Voxel pruneNode(uint32_t node_nr, const VoxCoord &coord);
00075
00079 Voxel addCSGObjectToVoxel(uint32_t node_nr, const VoxCoord &coord, int voxel_index, const CSGObject *obj, VoxOperation &csg_op);
00080
00084 Voxel addCSGObjectToNode(uint32_t node_nr, const VoxCoord &coord, const CSGObject *obj, VoxOperation &csg_op);
00085
00089 void generatePOVCodeForVoxel(uint32_t node_nr, const VoxCoord &coord, int voxel_index);
00090
00094 void generatePOVCodeForNode(uint32_t node_nr, const VoxCoord &coord);
00095
00096 public:
00097 uint64_t nr_nodes_created;
00098 uint64_t nr_nodes_destroyed;
00099
00104 VoxTree(double _size);
00105 ~VoxTree(void);
00106
00111 void generatePOVCode(void);
00112
00118 void addCSGObject(const CSGObject *obj, VoxOperation &csg_op);
00119
00124 void prune(void);
00125 };
00126
00127 }
00128
00129 #endif