Mesher's build_mesh function now has no argument, and returns an array.

This commit is contained in:
Relintai 2020-02-20 13:19:54 +01:00
parent 509d45a662
commit 8b734eec11
3 changed files with 47 additions and 20 deletions

View File

@ -80,21 +80,16 @@ void VoxelMesher::set_uv_margin(const Rect2 margin) {
_uv_margin = margin;
}
void VoxelMesher::build_mesh(RID mesh) {
ERR_FAIL_COND(mesh == RID());
VS::get_singleton()->mesh_clear(mesh);
Array VoxelMesher::build_mesh() {
if (_vertices.size() == 0) {
//Nothing to do
return;
Array a;
a.resize(VisualServer::ARRAY_MAX);
return a;
}
_surface_tool->begin(Mesh::PRIMITIVE_TRIANGLES);
//if (_material.is_valid())
// _surface_tool->set_material(_material);
if (_colors.size() != _vertices.size()) {
print_error("Colors.size() != vertices.size() -> " + String::num(_colors.size()) + " " + String::num(_vertices.size()));
@ -132,12 +127,7 @@ void VoxelMesher::build_mesh(RID mesh) {
_surface_tool->generate_normals();
}
Array arr = _surface_tool->commit_to_arrays();
VS::get_singleton()->mesh_add_surface_from_arrays(mesh, VisualServer::PRIMITIVE_TRIANGLES, arr);
if (_material.is_valid())
VS::get_singleton()->mesh_surface_set_material(mesh, 0, _library->get_material()->get_rid());
return _surface_tool->commit_to_arrays();
}
void VoxelMesher::reset() {
@ -873,5 +863,5 @@ void VoxelMesher::_bind_methods() {
//ClassDB::bind_method(D_METHOD("calculate_vertex_ambient_occlusion", "meshinstance_path", "radius", "intensity", "sampleCount"), &VoxelMesher::calculate_vertex_ambient_occlusion_path);
ClassDB::bind_method(D_METHOD("build_mesh", "mesh_rid"), &VoxelMesher::build_mesh);
ClassDB::bind_method(D_METHOD("build_mesh"), &VoxelMesher::build_mesh);
}

View File

@ -102,7 +102,7 @@ public:
void bake_lights(MeshInstance *node, Vector<Ref<VoxelLight> > &lights);
void build_mesh(RID mesh);
Array build_mesh();
PoolVector<Vector3> get_vertices();
void set_vertices(const PoolVector<Vector3> &values);

View File

@ -570,8 +570,19 @@ void VoxelChunk::finalize_mesh() {
}
ERR_FAIL_COND(!mesher.is_valid());
ERR_FAIL_COND(_mesh_rid == RID());
mesher->build_mesh(_mesh_rid);
VS::get_singleton()->mesh_clear(_mesh_rid);
if (mesher->get_vertex_count() == 0)
return;
Array arr = mesher->build_mesh();
VS::get_singleton()->mesh_add_surface_from_arrays(_mesh_rid, VisualServer::PRIMITIVE_TRIANGLES, arr);
if (_library->get_material().is_valid())
VS::get_singleton()->mesh_surface_set_material(_mesh_rid, 0, _library->get_material()->get_rid());
}
void VoxelChunk::build_deferred() {
@ -968,7 +979,20 @@ void VoxelChunk::process_props() {
mesher->bake_colors(this);
mesher->set_material(get_library()->get_material());
mesher->build_mesh(_prop_mesh_rid);
ERR_FAIL_COND(_prop_mesh_rid == RID());
VS::get_singleton()->mesh_clear(_prop_mesh_rid);
if (mesher->get_vertex_count() == 0)
return;
Array arr = mesher->build_mesh();
VS::get_singleton()->mesh_add_surface_from_arrays(_prop_mesh_rid, VisualServer::PRIMITIVE_TRIANGLES, arr);
if (_library->get_material().is_valid())
VS::get_singleton()->mesh_surface_set_material(_prop_mesh_rid, 0, _library->get_material()->get_rid());
}
}
@ -984,7 +1008,20 @@ void VoxelChunk::build_prop_meshes() {
mesher->bake_colors(this);
mesher->set_material(get_library()->get_material());
mesher->build_mesh(_prop_mesh_rid);
ERR_FAIL_COND(_prop_mesh_rid == RID());
VS::get_singleton()->mesh_clear(_prop_mesh_rid);
if (mesher->get_vertex_count() == 0)
return;
Array arr = mesher->build_mesh();
VS::get_singleton()->mesh_add_surface_from_arrays(_prop_mesh_rid, VisualServer::PRIMITIVE_TRIANGLES, arr);
if (_library->get_material().is_valid())
VS::get_singleton()->mesh_surface_set_material(_prop_mesh_rid, 0, _library->get_material()->get_rid());
}
}