Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __PolyVox_CubicSurfaceExtractor_H__
00025 #define __PolyVox_CubicSurfaceExtractor_H__
00026
00027 #include "PolyVoxImpl/TypeDef.h"
00028
00029 #include "PolyVoxCore/Array.h"
00030 #include "PolyVoxCore/SurfaceMesh.h"
00031
00032 namespace PolyVox
00033 {
00034 template< template<typename> class VolumeType, typename VoxelType>
00035 class CubicSurfaceExtractor
00036 {
00037 struct IndexAndMaterial
00038 {
00039 int32_t iIndex;
00040 int32_t uMaterial;
00041 };
00042
00043 enum FaceNames
00044 {
00045 PositiveX,
00046 PositiveY,
00047 PositiveZ,
00048 NegativeX,
00049 NegativeY,
00050 NegativeZ,
00051 NoOfFaces
00052 };
00053
00054 struct Quad
00055 {
00056 uint32_t vertices[4];
00057 };
00058
00059 public:
00060 CubicSurfaceExtractor(VolumeType<VoxelType>* volData, Region region, SurfaceMesh<PositionMaterial>* result, bool bMergeQuads = true);
00061
00062 void execute();
00063
00064 private:
00065 int32_t addVertex(float fX, float fY, float fZ, uint32_t uMaterial, Array<3, IndexAndMaterial>& existingVertices);
00066 bool performQuadMerging(std::list<Quad>& quads);
00067 bool mergeQuads(Quad& q1, Quad& q2);
00068
00069
00070 VolumeType<VoxelType>* m_volData;
00071
00072
00073 Region m_regSizeInVoxels;
00074
00075
00076 SurfaceMesh<PositionMaterial>* m_meshCurrent;
00077
00078
00079 Array<3, IndexAndMaterial> m_previousSliceVertices;
00080 Array<3, IndexAndMaterial> m_currentSliceVertices;
00081
00082
00083
00084 std::vector< std::list<Quad> > m_vecQuads[NoOfFaces];
00085
00086
00087
00088 bool m_bMergeQuads;
00089
00090
00091
00092
00093 static const uint32_t MaxQuadsSharingVertex;
00094 };
00095 }
00096
00097 #include "PolyVoxCore/CubicSurfaceExtractor.inl"
00098
00099 #endif