#ifndef TERRAIN_TOOLS_H #define TERRAIN_TOOLS_H #include "core/math/color.h" #include "core/object/reference.h" #include "core/containers/vector.h" #include "../defines.h" #include "core/containers/pool_vector.h" #include "scene/3d/mesh_instance.h" #include "core/math/rect2.h" #include "core/math/vector2.h" #include "core/math/vector3.h" #include "scene/main/node.h" #include "scene/resources/material/material.h" #include "scene/resources/mesh/mesh.h" #include "modules/modules_enabled.gen.h" #ifdef MODULE_MESH_DATA_RESOURCE_ENABLED #include "../../mesh_data_resource/mesh_data_resource.h" #endif #include "../library/terrain_library.h" class TerrainLibrary; class TerrainChunk; class TerrainMesher : public Reference { GDCLASS(TerrainMesher, Reference); public: const double PI_2 = 3.141592653589793238463 / 2; const double PI = 3.141592653589793238463; struct Vertex { Vector3 vertex; Color color; Vector3 normal; // normal, binormal, tangent Vector3 binormal; Vector3 tangent; Vector2 uv; Vector2 uv2; Vector bones; Vector weights; bool operator==(const Vertex &p_vertex) const; Vertex() {} }; struct VertexHasher { static _FORCE_INLINE_ uint32_t hash(const Vertex &p_vtx); }; struct WeightSort { int index; float weight; bool operator<(const WeightSort &p_right) const { return weight < p_right.weight; } }; public: int get_channel_index_type() const; void set_channel_index_type(const int value); int get_channel_index_isolevel() const; void set_channel_index_isolevel(const int value); int get_mesher_index() const; void set_mesher_index(const int value); int get_format() const; void set_format(const int value); int get_texture_scale() const; void set_texture_scale(const int value); int get_lod_index() const; void set_lod_index(const int value); Ref get_library(); void set_library(const Ref &library); Ref get_material(); void set_material(const Ref &material); float get_ao_strength() const; void set_ao_strength(const float value); float get_base_light_value() const; void set_base_light_value(const float value); float get_voxel_scale() const; void set_voxel_scale(const float voxel_scale); Rect2 get_uv_margin() const; void set_uv_margin(const Rect2 margin); bool get_is_liquid_mesher() const; void set_is_liquid_mesher(const bool value); void reset(); void add_chunk(Ref chunk); #ifdef MODULE_MESH_DATA_RESOURCE_ENABLED void add_mesh_data_resource(Ref mesh, const Vector3 position = Vector3(0, 0, 0), const Vector3 rotation = Vector3(0, 0, 0), const Vector3 scale = Vector3(1.0, 1.0, 1.0), const Rect2 uv_rect = Rect2(0, 0, 1, 1)); void add_mesh_data_resource_transform(Ref mesh, const Transform transform, const Rect2 uv_rect = Rect2(0, 0, 1, 1)); void add_mesh_data_resource_transform_colored(Ref mesh, const Transform transform, const PoolColorArray &colors, const Rect2 uv_rect = Rect2(0, 0, 1, 1)); #endif void add_mesher(const Ref &mesher); void _add_mesher(const Ref &mesher); void bake_colors(Ref chunk); void bake_liquid_colors(Ref chunk); PoolVector build_collider() const; void bake_lights(MeshInstance *node, Vector> &lights); Array build_mesh(); void build_mesh_into(RID mesh); void generate_normals(bool p_flip = false); void remove_doubles(); void remove_doubles_hashed(); PoolVector get_vertices() const; void set_vertices(const PoolVector &values); int get_vertex_count() const; Vector3 get_vertex(const int idx) const; void remove_vertex(const int idx); void add_vertex(const Vector3 &vertex); PoolVector get_normals() const; void set_normals(const PoolVector &values); Vector3 get_normal(const int idx) const; void add_normal(const Vector3 &normal); PoolVector get_colors() const; void set_colors(const PoolVector &values); Color get_color(const int idx) const; void add_color(const Color &color); PoolVector get_uvs() const; void set_uvs(const PoolVector &values); Vector2 get_uv(const int idx) const; void add_uv(const Vector2 &vector); PoolVector get_uv2s() const; void set_uv2s(const PoolVector &values); Vector2 get_uv2(const int idx) const; void add_uv2(const Vector2 &vector); PoolVector get_indices() const; void set_indices(const PoolVector &values); int get_indices_count() const; int get_index(const int idx) const; void remove_index(const int idx); void add_indices(const int index); TerrainMesher(const Ref &library); TerrainMesher(); ~TerrainMesher(); protected: static void _bind_methods(); int _channel_index_type; int _channel_index_isolevel; int _mesher_index; int _format; int _texture_scale; int _lod_index; bool _is_liquid_mesher; PoolVector _vertices; PoolVector _indices; Color _last_color; Vector3 _last_normal; Vector2 _last_uv; Vector2 _last_uv2; Vector _last_bones; Vector _last_weights; Plane _last_tangent; Ref _library; Ref _material; float _voxel_scale; float _ao_strength; float _base_light_value; Rect2 _uv_margin; }; #endif