Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef clSparseBoxelOctree_h__
- #define clSparseBoxelOctree_h__
- #include "clBitList.h"
- #include "clHashMap.h"
- #include "clTri3I32.h"
- #include "clTriangle3.h"
- #include "clFileStream.h"
- #include "clKeyValuePair.h"
- #include "clHTTPFileStream.h"
- #include "clSparseBoxelOctreeHelper.h"
- #include "clTextureStreamingService.h"
- #include "clSparseBoxelOctreeVisitor.h"
- #include "clSparseBoxelOctreeMomento.h"
- #include "clSparseBoxelOctreeRemoteData.h"
- #include "clSparseBoxelOctreeCompression.h"
- class clImage;
- struct clVoxel;
- struct clBoxel;
- struct clTriangle;
- class clDepthImage;
- template<typename T> class clFrustum;
- class clSparseBoxelOctree
- {
- public:
- class Region
- {
- public:
- i64 m_lastUsed = 0;
- clBitList m_occupancy;
- bool m_modified = false;
- clList<clBoxel> m_cliff;
- clList<clVoxel> m_voxelCache;
- clList<clBoxel> m_boxelCache;
- clList<clTri3I32> m_triangleCache;
- };
- static const i64 regionChildCount = 8;
- static const i64 regionResolution = 64;
- static const clString compressionModeDescriptions[4];
- clSparseBoxelOctree(const clPath &projectFolder, const clString &remoteDatasetURL = "");
- ~clSparseBoxelOctree();
- void Save();
- void Clear();
- void UnCache();
- i64 ActiveLayerCount() const;
- i64 UniqueVoxelCount() const;
- i64 SourceVoxelCount() const;
- clPath CurrentProjectPath() const;
- ui8 ActiveDataCompressionMode() const;
- clImage GeneratePreview(const i32 &resolution, const float zoom, float camYaw = clDegreesToRadians(45), float camPitch = clDegreesToRadians(45), clDepthImage *pDepthImage = nullptr);
- clImage GeneratePreview(const i32 &resolution = 64);
- clAABB3<i32> CalculateEncompassingBoundsApproximate(const ui8 &bitsOfResolution);
- void GenerateRemoteStreamable(const clPath &outputLSD);
- void CrushFileStream();
- void Undo();
- void Redo();
- bool CanUndo();
- bool CanRedo();
- void CommitAction();
- void ResolveVoxelCaches();
- bool HasCachedData(const Region ®ion);
- i64 SetTexture(const clImage &texture);
- void GenerateBlendedColors(ui8 minLayer = 0);
- void GetBoxels(clWriteStream *pWriter);
- void GetVoxels(clWriteStream *pWriter);
- void GetBoxels(clWriteStream *pWriter, const ui8 &numLayers);
- void GetBoxels(clWriteStream *pWriter, const clAABB3<i32> &area);
- void GetBoxels(clWriteStream *pWriter, const clFrustum<float> &frustum);
- void GetBoxels(clList<clBoxel> *pBoxels, const clVec3I ®ionPosition, const ui8 ®ionLayer, bool *pRegionWasBuiltFromCache = nullptr);
- void SetVoxel(const clVoxel &voxel, const bool &saveUndoData = false);
- void SetBoxel(const clBoxel &boxel, const bool &saveUndoData = false);
- //void GetTriangles(clWriteStream *pWriter, const clFrustum<float> &frustum);
- i64 RemoveVoxels(const clFrustum<float> &frustum, clImage *pMask = nullptr, const bool &saveUndoData = false);
- //clList<clVoxel> GetVoxels(const clVec3I ®ionPosition, const ui8 ®ionLayer, bool *pRegionWasBuiltFromCache = nullptr);
- void SetTriangle(const clVector3<clVec3I> &position, const clVector3<ui32> &color, const clVector3<clVec2> &textureCoordinates = { {}, {}, {} }, const i64 &texture = -1);
- void Visit(clBoxelVisitor visitor, i32 neighbourhoodRadius = 0, clAABB3<i32> area = clAABB3<i32>::Largest(), const bool &visitEmptyvoxels = false, const bool &visitEmptyNeighbourhoods = false, const i64 &stride = 1);
- private:
- void RegionCliffTriangleRecursiveIntersection(clBitList &occupancy, clList<clBoxel>* pBoxels, const clTri3I32 &triangle, const clVec3 &triNorm, const TriBoxIntersection &triBoxIntersection, const clAABB3<i32> &triangleBounds, const clVec3I ®ionPosition, const ui8 ®ionLayer, const clVec3I &subRegionPosition = clVec3I::Zero(), const i64 &subRegionLayer = clLog2Fast((ui32)regionResolution));
- void RegionCliffTriangle(clBitList &occupancy, clList<clBoxel> *pBoxels, const clTri3I32 &triangle, const TriBoxIntersection &triBoxIntersection, const clVec3I ®ionPosition, const ui8 ®ionLayer);
- void RegionCliffFromCache(clList<clBoxel> *pBoxels, Region *pRegion, const clVec3I ®ionPosition, const ui8 ®ionLayer, const bool &applyPreferedSpliting, bool *pRegionWasBuiltFromCache);
- void CliffRegion(clList<clBoxel> *pBoxels, const clVec3I ®ionPosition, const ui8 ®ionLayer, const bool &applyPreferedSpliting = true, bool *pRegionWasBuiltFromCache = nullptr);
- i64 RemoveVoxelsRecursiveIntersectFrustum(const clFrustum<float> &frustum, clVec3I position, ui8 layer, clImage *pMask = nullptr, const bool &saveUndoData = false);
- void AddToLayers(const clTri3I32 &triangle, const TriBoxIntersection &triBoxIntersection, i64 startingLayer = -1, const clVec3I ®ionPos = clVec3I::Zero());
- void GetBoxelsRecursive(clWriteStream *pWriter, const clVec3I ®ionPosition, const ui8 ®ionLayer, const clAABB3<i32> &area);
- void GetBoxelsRecursive(clWriteStream *pWriter, clVec3I position, ui8 layer, bool parentExists = true, bool voxelMode = false);
- void GetBoxelsRecursiveIntersectFrustum(const clFrustum<float> &frustum, clWriteStream *pWriter, clVec3I position, ui8 layer);
- void GenerateBlendedColorsRecursive(clVec3I regionPosition = clVec3I::Zero(), ui8 minLayer = 0, ui8 regionLayer = 255);
- Region* CacheRegion(const clVec3I ®ionPosition, const ui8 ®ionLayer, const bool &create = false);
- void GetVoxelPreviewRecursive(clWriteStream *pWriter, clVec3I position, ui8 layer, ui8 stopLayer);
- void RemoveFromLayers(const clBoxel &boxel, i64 startingLayer = 0, const bool &saveUndoData = false);
- ui32 SampleTriangle(const clTri3I32 &triangle, const clVec3 &weights, const ui8 ®ionLayer);
- void AddToLayers(const clVoxel &voxel, i64 startingLayer = -1, const bool &saveUndoData = false);
- void AddToLayers(const clBoxel &boxel, i64 startingLayer = -1, const bool &saveUndoData = false);
- void SplitRegionCache(Region *pRegion, const clVec3I ®ionPosition, const ui8 ®ionLayer);
- void UnloadRegion(Region *pRegion, const clVec3I ®ionPosition, const ui8 ®ionLayer);
- clPath RegionFileName(const clVec3I ®ionPosition, const ui8 ®ionLayer);
- void UncacheRegion(const clVec3I ®ionPosition, const ui8 ®ionLayer);
- bool AddToRegionCliff(Region *pRegion, clBoxel regionBoxel);
- void SplitCachesRecursive(clVec3I position, ui8 layer);
- void UncacheLeastRecentlyUsedRegion();
- bool WriteCompressionHeader();
- bool ReadCompressionHeader();
- void ExpandOctree();
- bool WriteHeader();
- bool ReadHeader();
- // IO
- void SaveRegion(Region *pRegion, const clVec3I ®ionPosition, const ui8 ®ionLayer);
- Region *LoadRegion(const clVec3I ®ionPosition, const ui8 ®ionLayer);
- // Compression
- void SerializeRegion(clWriteStream *pStream, Region *pRegion, const ui8 &compressionMode, const clVec3I ®ionMinPos = clVec3I::Zero());
- void DeserializeRegion(clReadStream *pStream, Region *pRegion, const ui8 &compressionMode, const clVec3I ®ionMinPos = clVec3I::Zero());
- // Remote
- bool ReadRemoteHeader();
- bool WriteRemoteHeader();
- bool DownloadRemoteHeader();
- // Memento
- bool ReadActionHeader();
- bool WriteActionHeader();
- void CompleteAction(); // Call this to push Undo/ReDo Action
- bool MoveBackAnAction(); // Undo
- bool MoveForwardAnAction(); // Redo
- void DoMomento(const clVoxelMemento &momento);
- void UndoMomento(const clVoxelMemento &momento);
- void ExtendAction(const clList<clVoxelMemento> &changes); // Call this to build up Undo/ReDo Action
- // Geometry Data //
- clFileStream m_geometryStream;
- clHashMap<clVec4I, i64> m_regionIndex;
- // Action Data //
- clFileStream m_actionStream;
- i64 m_currentAction = 0;
- i64 m_activeActionExtensionCount = 0;
- clList<clVec3I64> m_actionsHeader; // X = Stream Location, Y = Stream Length, Z = Action Count
- // Header Data //
- ui8 m_layerCount;
- i64 m_sourceVoxelCount;
- i64 m_uniqueVoxelCount;
- i64 m_sourceTriangleCount;
- // Directory Data //
- clPath m_projectFolderName;
- // Remote Data //
- clString m_remoteDatasetURL;
- i64 m_tileServiceLocation;
- i64 m_textureServiceLocation;
- clHTTPFileReader *m_pNetReader = nullptr;
- clHashMap<clVec4I, i64> m_regionLengths;
- // Texture Data //
- clTextureStreamingService *m_pTextures;
- // Geometry Data //
- ui8 m_fileSystemMode = 1; // 0-Flat, 1-PartialCombined, 2-NetworkBacked, 3-FullyCombined (not yet implemented)
- ui8 m_compressionMode = 0; // 0-Raw, 1-LZ4 (Very Fast), 2-ZSTD (Fast), 3-ZPAQ (Very Slow)
- i64 m_currentAccessRound = 0;
- i64 m_modifiedRegionCount = 0;
- clHashMap<clVec4I, Region*> m_regionsCachedByPosition;
- clList<clKeyValuePair<clVec3I, Region*>> m_regionsCachedByLayer;
- };
- #endif // clSparseBoxelOctree_h__
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement