#ifndef VOXEL_TERRAIN_H #define VOXEL_TERRAIN_H #include #include "voxel_map.h" #include "voxel_mesher.h" #include "voxel_provider.h" // TODO //#define VOXEL_TERRAIN_PROFILING // Infinite static terrain made of voxels. // It is loaded around VoxelTerrainStreamers. class VoxelTerrain : public Node /*, public IVoxelMapObserver*/ { GDCLASS(VoxelTerrain, Node) public: VoxelTerrain(); void set_provider(Ref provider); Ref get_provider(); void force_load_blocks(Vector3i center, Vector3i extents); int get_block_update_count(); void set_generate_collisions(bool enabled); bool get_generate_collisions() { return _generate_collisions; } Ref get_mesher() { return _mesher; } Ref get_map() { return _map; } Ref get_voxel_library(); protected: void _notification(int p_what); void _process(); void update_blocks(); void update_block_mesh(Vector3i block_pos); // Observer events //void block_removed(VoxelBlock & block); static void _bind_methods(); // Convenience Vector3 _voxel_to_block_binding(Vector3 pos) { return Vector3i(VoxelMap::voxel_to_block(pos)).to_vec3(); } Vector3 _block_to_voxel_binding(Vector3 pos) { return Vector3i(VoxelMap::block_to_voxel(pos)).to_vec3(); } void _force_load_blocks_binding(Vector3 center, Vector3 extents) { force_load_blocks(center, extents); } Variant _raycast_binding(Vector3 origin, Vector3 direction, real_t max_distance); private: // Parameters int _min_y; // In blocks, not voxels int _max_y; // Voxel storage Ref _map; Vector _block_update_queue; Ref _mesher; Ref _provider; bool _generate_collisions; }; #endif // VOXEL_TERRAIN_H