godot_voxel/voxel_terrain.h

68 lines
1.7 KiB
C++

#ifndef VOXEL_TERRAIN_H
#define VOXEL_TERRAIN_H
#include <scene/main/node.h>
#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<VoxelProvider> provider);
Ref<VoxelProvider> 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<VoxelMesher> get_mesher() { return _mesher; }
Ref<VoxelMap> get_map() { return _map; }
Ref<VoxelLibrary> 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<VoxelMap> _map;
Vector<Vector3i> _block_update_queue;
Ref<VoxelMesher> _mesher;
Ref<VoxelProvider> _provider;
bool _generate_collisions;
};
#endif // VOXEL_TERRAIN_H