60 lines
1.5 KiB
C++
60 lines
1.5 KiB
C++
#ifndef WORLD_TERRAIN_LOD_H
|
|
#define WORLD_TERRAIN_LOD_H
|
|
#include <core/hash_map.h>
|
|
#include <core/reference.h>
|
|
#include <scene/resources/mesh.h>
|
|
#include <scene/resources/world.h>
|
|
#include <scene/resources/packed_scene.h>
|
|
#include <modules/voxel/util/math/vector3i.h>
|
|
#include "world_chunk.h"
|
|
#include "terrain_object.h"
|
|
#include "new_point.h"
|
|
#include "direct_lod_multimesh.h"
|
|
class LodMultiMesh3D;
|
|
class WorldChunk;
|
|
class WorldTerrainLod {
|
|
public:
|
|
List<LodMultiMesh3D *> meshes;
|
|
private:
|
|
HashMap<Vector3i, LodMultiMesh3D *, Vector3iHasher> mesh_h;
|
|
int min_dist, max_dist;
|
|
Ref<World> gworld;
|
|
float density_range = 3.0f;
|
|
public:
|
|
void set_world(Ref<World> world);
|
|
void init_lod(int mind, int maxd,
|
|
float density_range);
|
|
void create_chunk(const WorldChunk *chunk, const List<TerrainObject> &obj_list);
|
|
void update();
|
|
inline bool has(const Vector3i *loc) const
|
|
{
|
|
return mesh_h.has(*loc);
|
|
}
|
|
void cleanup(const Transform &vxform);
|
|
bool valid_org(const Transform &vxform, const Vector3 &org, float margin) const;
|
|
void update_visibility(const Transform &vxform);
|
|
inline float get_density_range() const
|
|
{
|
|
return density_range;
|
|
}
|
|
inline bool in_range(float d) const
|
|
{
|
|
if (d >= (float)min_dist && d < (float)max_dist)
|
|
return true;
|
|
return false;
|
|
}
|
|
inline void erase(const Vector3i &key)
|
|
{
|
|
if (mesh_h.has(key)) {
|
|
LodMultiMesh3D *v = mesh_h[key];
|
|
v->hide();
|
|
v->set_world(NULL);
|
|
memfree(v);
|
|
meshes.erase(v);
|
|
mesh_h.erase(key);
|
|
}
|
|
}
|
|
};
|
|
#endif
|
|
|