1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-23 15:16:17 +00:00

Use a more specific type for Mesh create_(convex|trimesh)_shape

This commit is contained in:
Aaron Franke
2022-11-25 11:43:06 -06:00
parent a9fbf3718d
commit 93ab82536d
10 changed files with 27 additions and 18 deletions

View File

@@ -97,7 +97,7 @@
</description> </description>
</method> </method>
<method name="create_convex_shape" qualifiers="const"> <method name="create_convex_shape" qualifiers="const">
<return type="Shape3D" /> <return type="ConvexPolygonShape3D" />
<param index="0" name="clean" type="bool" default="true" /> <param index="0" name="clean" type="bool" default="true" />
<param index="1" name="simplify" type="bool" default="false" /> <param index="1" name="simplify" type="bool" default="false" />
<description> <description>
@@ -115,7 +115,7 @@
</description> </description>
</method> </method>
<method name="create_trimesh_shape" qualifiers="const"> <method name="create_trimesh_shape" qualifiers="const">
<return type="Shape3D" /> <return type="ConcavePolygonShape3D" />
<description> <description>
Calculate a [ConcavePolygonShape3D] from the mesh. Calculate a [ConcavePolygonShape3D] from the mesh.
</description> </description>

View File

@@ -355,7 +355,7 @@ static void _pre_gen_shape_list(Ref<ImporterMesh> &mesh, Vector<Ref<Shape3D>> &r
ERR_FAIL_NULL_MSG(mesh, "Cannot generate shape list with null mesh value"); ERR_FAIL_NULL_MSG(mesh, "Cannot generate shape list with null mesh value");
ERR_FAIL_NULL_MSG(mesh->get_mesh(), "Cannot generate shape list with null mesh value"); ERR_FAIL_NULL_MSG(mesh->get_mesh(), "Cannot generate shape list with null mesh value");
if (!p_convex) { if (!p_convex) {
Ref<Shape3D> shape = mesh->create_trimesh_shape(); Ref<ConcavePolygonShape3D> shape = mesh->create_trimesh_shape();
r_shape_list.push_back(shape); r_shape_list.push_back(shape);
} else { } else {
Vector<Ref<Shape3D>> cd; Vector<Ref<Shape3D>> cd;

View File

@@ -38,6 +38,8 @@
#include "scene/3d/navigation_region_3d.h" #include "scene/3d/navigation_region_3d.h"
#include "scene/3d/physics_body_3d.h" #include "scene/3d/physics_body_3d.h"
#include "scene/gui/box_container.h" #include "scene/gui/box_container.h"
#include "scene/resources/concave_polygon_shape_3d.h"
#include "scene/resources/convex_polygon_shape_3d.h"
void MeshInstance3DEditor::_node_removed(Node *p_node) { void MeshInstance3DEditor::_node_removed(Node *p_node) {
if (p_node == node) { if (p_node == node) {
@@ -66,7 +68,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) {
List<Node *> selection = editor_selection->get_selected_node_list(); List<Node *> selection = editor_selection->get_selected_node_list();
if (selection.is_empty()) { if (selection.is_empty()) {
Ref<Shape3D> shape = mesh->create_trimesh_shape(); Ref<ConcavePolygonShape3D> shape = mesh->create_trimesh_shape();
if (shape.is_null()) { if (shape.is_null()) {
err_dialog->set_text(TTR("Couldn't create a Trimesh collision shape.")); err_dialog->set_text(TTR("Couldn't create a Trimesh collision shape."));
err_dialog->popup_centered(); err_dialog->popup_centered();
@@ -105,7 +107,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) {
continue; continue;
} }
Ref<Shape3D> shape = m->create_trimesh_shape(); Ref<ConcavePolygonShape3D> shape = m->create_trimesh_shape();
if (shape.is_null()) { if (shape.is_null()) {
continue; continue;
} }
@@ -137,7 +139,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) {
return; return;
} }
Ref<Shape3D> shape = mesh->create_trimesh_shape(); Ref<ConcavePolygonShape3D> shape = mesh->create_trimesh_shape();
if (shape.is_null()) { if (shape.is_null()) {
return; return;
} }
@@ -171,7 +173,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) {
bool simplify = (p_option == MENU_OPTION_CREATE_SIMPLIFIED_CONVEX_COLLISION_SHAPE); bool simplify = (p_option == MENU_OPTION_CREATE_SIMPLIFIED_CONVEX_COLLISION_SHAPE);
Ref<Shape3D> shape = mesh->create_convex_shape(true, simplify); Ref<ConvexPolygonShape3D> shape = mesh->create_convex_shape(true, simplify);
if (shape.is_null()) { if (shape.is_null()) {
err_dialog->set_text(TTR("Couldn't create a single convex collision shape.")); err_dialog->set_text(TTR("Couldn't create a single convex collision shape."));

View File

@@ -30,6 +30,7 @@
#include "collision_object_3d.h" #include "collision_object_3d.h"
#include "scene/resources/shape_3d.h"
#include "scene/scene_string_names.h" #include "scene/scene_string_names.h"
void CollisionObject3D::_notification(int p_what) { void CollisionObject3D::_notification(int p_what) {

View File

@@ -33,6 +33,8 @@
#include "collision_shape_3d.h" #include "collision_shape_3d.h"
#include "core/core_string_names.h" #include "core/core_string_names.h"
#include "physics_body_3d.h" #include "physics_body_3d.h"
#include "scene/resources/concave_polygon_shape_3d.h"
#include "scene/resources/convex_polygon_shape_3d.h"
bool MeshInstance3D::_set(const StringName &p_name, const Variant &p_value) { bool MeshInstance3D::_set(const StringName &p_name, const Variant &p_value) {
//this is not _too_ bad performance wise, really. it only arrives here if the property was not set anywhere else. //this is not _too_ bad performance wise, really. it only arrives here if the property was not set anywhere else.
@@ -224,7 +226,7 @@ Node *MeshInstance3D::create_trimesh_collision_node() {
return nullptr; return nullptr;
} }
Ref<Shape3D> shape = mesh->create_trimesh_shape(); Ref<ConcavePolygonShape3D> shape = mesh->create_trimesh_shape();
if (shape.is_null()) { if (shape.is_null()) {
return nullptr; return nullptr;
} }
@@ -254,7 +256,7 @@ Node *MeshInstance3D::create_convex_collision_node(bool p_clean, bool p_simplify
return nullptr; return nullptr;
} }
Ref<Shape3D> shape = mesh->create_convex_shape(p_clean, p_simplify); Ref<ConvexPolygonShape3D> shape = mesh->create_convex_shape(p_clean, p_simplify);
if (shape.is_null()) { if (shape.is_null()) {
return nullptr; return nullptr;
} }

View File

@@ -31,6 +31,7 @@
#include "spring_arm_3d.h" #include "spring_arm_3d.h"
#include "scene/3d/camera_3d.h" #include "scene/3d/camera_3d.h"
#include "scene/resources/shape_3d.h"
void SpringArm3D::_notification(int p_what) { void SpringArm3D::_notification(int p_what) {
switch (p_what) { switch (p_what) {

View File

@@ -971,10 +971,10 @@ Vector<Ref<Shape3D>> ImporterMesh::convex_decompose(const Mesh::ConvexDecomposit
return ret; return ret;
} }
Ref<Shape3D> ImporterMesh::create_trimesh_shape() const { Ref<ConcavePolygonShape3D> ImporterMesh::create_trimesh_shape() const {
Vector<Face3> faces = get_faces(); Vector<Face3> faces = get_faces();
if (faces.size() == 0) { if (faces.size() == 0) {
return Ref<Shape3D>(); return Ref<ConcavePolygonShape3D>();
} }
Vector<Vector3> face_points; Vector<Vector3> face_points;

View File

@@ -119,7 +119,7 @@ public:
Vector<Face3> get_faces() const; Vector<Face3> get_faces() const;
Vector<Ref<Shape3D>> convex_decompose(const Mesh::ConvexDecompositionSettings &p_settings) const; Vector<Ref<Shape3D>> convex_decompose(const Mesh::ConvexDecompositionSettings &p_settings) const;
Ref<Shape3D> create_trimesh_shape() const; Ref<ConcavePolygonShape3D> create_trimesh_shape() const;
Ref<NavigationMesh> create_navigation_mesh(); Ref<NavigationMesh> create_navigation_mesh();
Error lightmap_unwrap_cached(const Transform3D &p_base_transform, float p_texel_size, const Vector<uint8_t> &p_src_cache, Vector<uint8_t> &r_dst_cache); Error lightmap_unwrap_cached(const Transform3D &p_base_transform, float p_texel_size, const Vector<uint8_t> &p_src_cache, Vector<uint8_t> &r_dst_cache);

View File

@@ -388,7 +388,7 @@ Vector<Face3> Mesh::get_surface_faces(int p_surface) const {
return Vector<Face3>(); return Vector<Face3>();
} }
Ref<Shape3D> Mesh::create_convex_shape(bool p_clean, bool p_simplify) const { Ref<ConvexPolygonShape3D> Mesh::create_convex_shape(bool p_clean, bool p_simplify) const {
if (p_simplify) { if (p_simplify) {
ConvexDecompositionSettings settings; ConvexDecompositionSettings settings;
settings.max_convex_hulls = 1; settings.max_convex_hulls = 1;
@@ -425,10 +425,10 @@ Ref<Shape3D> Mesh::create_convex_shape(bool p_clean, bool p_simplify) const {
return shape; return shape;
} }
Ref<Shape3D> Mesh::create_trimesh_shape() const { Ref<ConcavePolygonShape3D> Mesh::create_trimesh_shape() const {
Vector<Face3> faces = get_faces(); Vector<Face3> faces = get_faces();
if (faces.size() == 0) { if (faces.size() == 0) {
return Ref<Shape3D>(); return Ref<ConcavePolygonShape3D>();
} }
Vector<Vector3> face_points; Vector<Vector3> face_points;

View File

@@ -35,9 +35,12 @@
#include "core/math/face3.h" #include "core/math/face3.h"
#include "core/math/triangle_mesh.h" #include "core/math/triangle_mesh.h"
#include "scene/resources/material.h" #include "scene/resources/material.h"
#include "scene/resources/shape_3d.h"
#include "servers/rendering_server.h" #include "servers/rendering_server.h"
class ConcavePolygonShape3D;
class ConvexPolygonShape3D;
class Shape3D;
class Mesh : public Resource { class Mesh : public Resource {
GDCLASS(Mesh, Resource); GDCLASS(Mesh, Resource);
@@ -211,8 +214,8 @@ public:
static ConvexDecompositionFunc convex_decomposition_function; static ConvexDecompositionFunc convex_decomposition_function;
Vector<Ref<Shape3D>> convex_decompose(const ConvexDecompositionSettings &p_settings) const; Vector<Ref<Shape3D>> convex_decompose(const ConvexDecompositionSettings &p_settings) const;
Ref<Shape3D> create_convex_shape(bool p_clean = true, bool p_simplify = false) const; Ref<ConvexPolygonShape3D> create_convex_shape(bool p_clean = true, bool p_simplify = false) const;
Ref<Shape3D> create_trimesh_shape() const; Ref<ConcavePolygonShape3D> create_trimesh_shape() const;
virtual int get_builtin_bind_pose_count() const; virtual int get_builtin_bind_pose_count() const;
virtual Transform3D get_builtin_bind_pose(int p_index) const; virtual Transform3D get_builtin_bind_pose(int p_index) const;