From 9a8ed5cfce9e2f3da41cc83b01d7d60774bb333d Mon Sep 17 00:00:00 2001 From: Patrick Marsee Date: Mon, 30 Mar 2026 19:02:17 -0400 Subject: [PATCH] Updated for Godot 4.6 --- Cargo.toml | 6 ++--- src/path_mesh_3d.rs | 61 ++++++++++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 29 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 465b04e..0dc9eb8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "path_mesh" -version = "0.1.0" -edition = "2021" +version = "0.2.0" +edition = "2024" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -9,4 +9,4 @@ edition = "2021" crate-type = ["cdylib"] # Compile this crate to a dynamic C library. [dependencies] -godot = { git = "https://github.com/godot-rust/gdext", branch = "master" } +godot = "0.5.0" diff --git a/src/path_mesh_3d.rs b/src/path_mesh_3d.rs index e0d70ac..c8d7a5a 100644 --- a/src/path_mesh_3d.rs +++ b/src/path_mesh_3d.rs @@ -2,7 +2,6 @@ use crate::prelude::*; use std::cmp::Eq; use std::cmp::PartialEq; use std::collections::HashMap; -//use std::collections::BTreeMap; use std::hash::Hash; use std::hash::Hasher; use std::iter::zip; @@ -13,7 +12,6 @@ use godot::classes::mesh::PrimitiveType; use godot::classes::Mesh; use godot::classes::ArrayMesh; use godot::classes::Curve3D; -use godot::classes::Material; use godot::classes::MeshInstance3D; use godot::classes::IMeshInstance3D; @@ -208,10 +206,10 @@ impl PathMesh3D { let arrays = mesh.surface_get_arrays(i); if let Ok(new_arrays) = self.process_array(&arrays, &mut data) { - new_mesh.add_surface_from_arrays(primitive, new_arrays); - new_mesh.surface_set_name(i, name); + new_mesh.add_surface_from_arrays(primitive, &new_arrays); + new_mesh.surface_set_name(i, &name); if let Some(material) = mesh.surface_get_material(i) { - new_mesh.surface_set_material(i, material); + new_mesh.surface_set_material(i, &material); } } } @@ -219,7 +217,8 @@ impl PathMesh3D { if VERBOSE { godot_print!("new_mesh.surface_count = {}", new_mesh.get_surface_count()); } - self.base_mut().set_mesh(new_mesh.upcast::()); + //self.base_mut().set_mesh(new_mesh.upcast::()); + self.base_mut().set_mesh(&new_mesh); } } } @@ -231,43 +230,53 @@ impl PathMesh3D { // Caching curve samples could speed up their processing. // 2. Current method results in duplicate vertices where model ends meet. // Reusing previous vertices could speed up processing and be lighter on memory. - let mut processed = VariantArray::new(); + let mut processed = VarArray::new(); processed.resize(ArrayType::MAX.ord().try_into().unwrap(), &Variant::nil()); if data.curve.get_point_count() > 1 { let vertices = original.at(ARRAY_VERTEX).to::(); //must have let new_vertices = self.generate_vertices(&vertices, data); - if let Ok(normals) = original.at(ARRAY_NORMAL).try_to::() { - processed.set(ARRAY_NORMAL, self.generate_normals(&normals, &vertices, data).to_variant()); + let normals = original.at(ARRAY_NORMAL); + if !normals.is_nil() && let Ok(normals) = normals.try_to::() { + processed.set(ARRAY_NORMAL, &self.generate_normals(&normals, &vertices, data).to_variant()); } - if let Ok(tangents) = original.at(ARRAY_TANGENT).try_to::() { - processed.set(ARRAY_TANGENT, self.generate_tangents(&tangents, &vertices, data).to_variant()); + let tangents = original.at(ARRAY_TANGENT); + if !tangents.is_nil() && let Ok(tangents) = tangents.try_to::() { + processed.set(ARRAY_TANGENT, &self.generate_tangents(&tangents, &vertices, data).to_variant()); } - if let Ok(colors) = original.at(ARRAY_COLOR).try_to::() { - processed.set(ARRAY_COLOR, self.generate_colors(&colors, data).to_variant()); + let colors = original.at(ARRAY_COLOR); + if !colors.is_nil() && let Ok(colors) = colors.try_to::() { + processed.set(ARRAY_COLOR, &self.generate_colors(&colors, data).to_variant()); } - if let Ok(uvs) = original.at(ARRAY_TEX_UV).try_to::() { - processed.set(ARRAY_TEX_UV, self.generate_uvs(&uvs, data).to_variant()); - } - else if let Ok(_uvs) = original.at(ARRAY_TEX_UV).try_to::() { - processed.set(ARRAY_TEX_UV, self.generate_triplanar_uvs(&vertices).to_variant()); + let uvs = original.at(ARRAY_TEX_UV); + if !uvs.is_nil() { + if let Ok(uvs) = uvs.try_to::() { + processed.set(ARRAY_TEX_UV, &self.generate_uvs(&uvs, data).to_variant()); + } + else if let Ok(uvs) = uvs.try_to::() { + processed.set(ARRAY_TEX_UV, &self.generate_triplanar_uvs(&vertices).to_variant()); + } } - if let Ok(uvs) = original.at(ARRAY_TEX_UV2).try_to::() { - processed.set(ARRAY_TEX_UV2, self.generate_uvs(&uvs, data).to_variant()); - } - else if let Ok(_uvs) = original.at(ARRAY_TEX_UV2).try_to::() { - processed.set(ARRAY_TEX_UV2, self.generate_triplanar_uvs(&vertices).to_variant()); + let uvs = original.at(ARRAY_TEX_UV); + if !uvs.is_nil() { + if let Ok(uvs) = uvs.try_to::() { + processed.set(ARRAY_TEX_UV2, &self.generate_uvs(&uvs, data).to_variant()); + } + else if let Ok(uvs) = uvs.try_to::() { + processed.set(ARRAY_TEX_UV2, &self.generate_triplanar_uvs(&vertices).to_variant()); + } } - if let Ok(indecies) = original.at(ARRAY_INDEX).try_to::() { - processed.set(ARRAY_INDEX, self.generate_indecies(&indecies, vertices.len() as i32, data).to_variant()); + let indecies = original.at(ARRAY_INDEX); + if !indecies.is_nil() && let Ok(indecies) = indecies.try_to::() { + processed.set(ARRAY_INDEX, &self.generate_indecies(&indecies, vertices.len() as i32, data).to_variant()); } - processed.set(ARRAY_VERTEX, new_vertices.to_variant()); + processed.set(ARRAY_VERTEX, &new_vertices.to_variant()); return Ok(processed); } return Err(MeshArrayError::NotEnoughPoints);