Updated for Godot 4.6
This commit is contained in:
parent
10c2e5f2b0
commit
9a8ed5cfce
2 changed files with 38 additions and 29 deletions
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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::<Mesh>());
|
||||
//self.base_mut().set_mesh(new_mesh.upcast::<Mesh>());
|
||||
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::<PackedVector3Array>(); //must have
|
||||
let new_vertices = self.generate_vertices(&vertices, data);
|
||||
|
||||
if let Ok(normals) = original.at(ARRAY_NORMAL).try_to::<PackedVector3Array>() {
|
||||
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::<PackedVector3Array>() {
|
||||
processed.set(ARRAY_NORMAL, &self.generate_normals(&normals, &vertices, data).to_variant());
|
||||
}
|
||||
|
||||
if let Ok(tangents) = original.at(ARRAY_TANGENT).try_to::<PackedFloat32Array>() {
|
||||
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::<PackedFloat32Array>() {
|
||||
processed.set(ARRAY_TANGENT, &self.generate_tangents(&tangents, &vertices, data).to_variant());
|
||||
}
|
||||
|
||||
if let Ok(colors) = original.at(ARRAY_COLOR).try_to::<PackedColorArray>() {
|
||||
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::<PackedColorArray>() {
|
||||
processed.set(ARRAY_COLOR, &self.generate_colors(&colors, data).to_variant());
|
||||
}
|
||||
|
||||
if let Ok(uvs) = original.at(ARRAY_TEX_UV).try_to::<PackedVector2Array>() {
|
||||
processed.set(ARRAY_TEX_UV, self.generate_uvs(&uvs, data).to_variant());
|
||||
let uvs = original.at(ARRAY_TEX_UV);
|
||||
if !uvs.is_nil() {
|
||||
if let Ok(uvs) = uvs.try_to::<PackedVector2Array>() {
|
||||
processed.set(ARRAY_TEX_UV, &self.generate_uvs(&uvs, data).to_variant());
|
||||
}
|
||||
else if let Ok(uvs) = uvs.try_to::<PackedVector3Array>() {
|
||||
processed.set(ARRAY_TEX_UV, &self.generate_triplanar_uvs(&vertices).to_variant());
|
||||
}
|
||||
else if let Ok(_uvs) = original.at(ARRAY_TEX_UV).try_to::<PackedVector3Array>() {
|
||||
processed.set(ARRAY_TEX_UV, self.generate_triplanar_uvs(&vertices).to_variant());
|
||||
}
|
||||
|
||||
if let Ok(uvs) = original.at(ARRAY_TEX_UV2).try_to::<PackedVector2Array>() {
|
||||
processed.set(ARRAY_TEX_UV2, self.generate_uvs(&uvs, data).to_variant());
|
||||
let uvs = original.at(ARRAY_TEX_UV);
|
||||
if !uvs.is_nil() {
|
||||
if let Ok(uvs) = uvs.try_to::<PackedVector2Array>() {
|
||||
processed.set(ARRAY_TEX_UV2, &self.generate_uvs(&uvs, data).to_variant());
|
||||
}
|
||||
else if let Ok(uvs) = uvs.try_to::<PackedVector3Array>() {
|
||||
processed.set(ARRAY_TEX_UV2, &self.generate_triplanar_uvs(&vertices).to_variant());
|
||||
}
|
||||
else if let Ok(_uvs) = original.at(ARRAY_TEX_UV2).try_to::<PackedVector3Array>() {
|
||||
processed.set(ARRAY_TEX_UV2, self.generate_triplanar_uvs(&vertices).to_variant());
|
||||
}
|
||||
|
||||
if let Ok(indecies) = original.at(ARRAY_INDEX).try_to::<PackedInt32Array>() {
|
||||
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::<PackedInt32Array>() {
|
||||
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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue