Browse Source

Take CSG into account for nav-mesh generation

jfons 6 years ago
parent
commit
051ef5ead2
2 changed files with 19 additions and 1 deletions
  1. 1 1
      modules/csg/csg_shape.h
  2. 18 0
      modules/recast/navigation_mesh_generator.cpp

+ 1 - 1
modules/csg/csg_shape.h

@@ -116,9 +116,9 @@ protected:
 
 	virtual void _validate_property(PropertyInfo &property) const;
 
+public:
 	Array get_meshes() const;
 
-public:
 	void set_operation(Operation p_operation);
 	Operation get_operation() const;
 

+ 18 - 0
modules/recast/navigation_mesh_generator.cpp

@@ -45,6 +45,10 @@
 #include "scene/resources/shape.h"
 #include "scene/resources/sphere_shape.h"
 
+#ifdef MODULE_CSG_ENABLED
+#include "modules/csg/csg_shape.h"
+#endif
+
 EditorNavigationMeshGenerator *EditorNavigationMeshGenerator::singleton = NULL;
 
 void EditorNavigationMeshGenerator::_add_vertex(const Vector3 &p_vec3, Vector<float> &p_verticies) {
@@ -134,6 +138,20 @@ void EditorNavigationMeshGenerator::_parse_geometry(Transform p_accumulated_tran
 		}
 	}
 
+#ifdef MODULE_CSG_ENABLED
+	if (Object::cast_to<CSGShape>(p_node) && p_generate_from != NavigationMesh::PARSED_GEOMETRY_STATIC_COLLIDERS) {
+
+		CSGShape *csg_shape = Object::cast_to<CSGShape>(p_node);
+		Array meshes = csg_shape->get_meshes();
+		if (!meshes.empty()) {
+			Ref<Mesh> mesh = meshes[1];
+			if (mesh.is_valid()) {
+				_add_mesh(mesh, p_accumulated_transform * csg_shape->get_transform(), p_verticies, p_indices);
+			}
+		}
+	}
+#endif
+
 	if (Object::cast_to<StaticBody>(p_node) && p_generate_from != NavigationMesh::PARSED_GEOMETRY_MESH_INSTANCES) {
 		StaticBody *static_body = Object::cast_to<StaticBody>(p_node);