From 081e8425608502b954890cfec305e1314aaa4088 Mon Sep 17 00:00:00 2001 From: Lamakaio Date: Sat, 5 Oct 2024 18:23:14 +0200 Subject: [PATCH] fix smooth shading (by not ignoring normals) --- src/gdextension/render.cpp | 40 ++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/src/gdextension/render.cpp b/src/gdextension/render.cpp index 987180bf..18fae345 100644 --- a/src/gdextension/render.cpp +++ b/src/gdextension/render.cpp @@ -24,7 +24,9 @@ */ #include "render.h" +#include "osp/core/math_types.h" +#include #include #include #include @@ -32,11 +34,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -215,27 +219,33 @@ void SysRenderGd::compile_resource_meshes( st.begin(static_cast(primitive)); godot::RID mesh = rs->mesh_create(); + auto pos = meshData.positions3DAsArray(); - // TODO copy other attributes as well maybe + + bool has_normals = meshData.hasAttribute(Magnum::Trade::MeshAttribute::Normal); + auto normals = has_normals ? meshData.normalsAsArray() : Corrade::Containers::Array(); + auto indices = meshData.indicesAsArray(); - //TODO do that using an iterator I guess. - uint32_t sg = 0; - for ( auto i = indices.end(); i >= indices.begin() + 1;) + + for (size_t i = 0; i < pos.size(); i++) { - st.set_smooth_group(sg++); - auto v = pos[*(--i)]; - st.add_vertex(godot::Vector3(v.x(), v.y(), v.z())); - v = pos[*(--i)]; - st.add_vertex(godot::Vector3(v.x(), v.y(), v.z())); - v = pos[*(--i)]; + if (has_normals) + { + auto n = normals[i]; + st.set_normal(godot::Vector3(n.x(), n.y(), n.z())); + } + auto v = pos[i]; st.add_vertex(godot::Vector3(v.x(), v.y(), v.z())); } - if ( primitive == godot::RenderingServer::PRIMITIVE_TRIANGLES ) + + for (auto i = indices.end() - 1; i >= indices.begin(); --i) + { + st.add_index(static_cast(*i)); + } + + if ( primitive == godot::RenderingServer::PRIMITIVE_TRIANGLES && !has_normals ) { - //st.deindex(); - st.generate_normals(); - //st.generate_tangents(); - + st.generate_normals(); } godot::Array meshArray = st.commit_to_arrays();