You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
Fix Selection Game View
This commit is contained in:
@@ -915,6 +915,13 @@ PackedStringArray CSGShape3D::get_configuration_warnings() const {
|
|||||||
return warnings;
|
return warnings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<TriangleMesh> CSGShape3D::generate_triangle_mesh() const {
|
||||||
|
if (root_mesh.is_valid()) {
|
||||||
|
return root_mesh->generate_triangle_mesh();
|
||||||
|
}
|
||||||
|
return Ref<TriangleMesh>();
|
||||||
|
}
|
||||||
|
|
||||||
void CSGShape3D::_bind_methods() {
|
void CSGShape3D::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("_update_shape"), &CSGShape3D::_update_shape);
|
ClassDB::bind_method(D_METHOD("_update_shape"), &CSGShape3D::_update_shape);
|
||||||
ClassDB::bind_method(D_METHOD("is_root_shape"), &CSGShape3D::is_root_shape);
|
ClassDB::bind_method(D_METHOD("is_root_shape"), &CSGShape3D::is_root_shape);
|
||||||
|
|||||||
@@ -169,6 +169,8 @@ public:
|
|||||||
Ref<ArrayMesh> bake_static_mesh();
|
Ref<ArrayMesh> bake_static_mesh();
|
||||||
Ref<ConcavePolygonShape3D> bake_collision_shape();
|
Ref<ConcavePolygonShape3D> bake_collision_shape();
|
||||||
|
|
||||||
|
virtual Ref<TriangleMesh> generate_triangle_mesh() const override;
|
||||||
|
|
||||||
CSGShape3D();
|
CSGShape3D();
|
||||||
~CSGShape3D();
|
~CSGShape3D();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ public:
|
|||||||
StandardMaterial3D::TextureFilter get_texture_filter() const;
|
StandardMaterial3D::TextureFilter get_texture_filter() const;
|
||||||
|
|
||||||
virtual AABB get_aabb() const override;
|
virtual AABB get_aabb() const override;
|
||||||
Ref<TriangleMesh> generate_triangle_mesh() const;
|
virtual Ref<TriangleMesh> generate_triangle_mesh() const override;
|
||||||
|
|
||||||
Label3D();
|
Label3D();
|
||||||
~Label3D();
|
~Label3D();
|
||||||
|
|||||||
@@ -835,6 +835,13 @@ Ref<ArrayMesh> MeshInstance3D::bake_mesh_from_current_skeleton_pose(Ref<ArrayMes
|
|||||||
return bake_mesh;
|
return bake_mesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<TriangleMesh> MeshInstance3D::generate_triangle_mesh() const {
|
||||||
|
if (mesh.is_valid()) {
|
||||||
|
return mesh->generate_triangle_mesh();
|
||||||
|
}
|
||||||
|
return Ref<TriangleMesh>();
|
||||||
|
}
|
||||||
|
|
||||||
void MeshInstance3D::_bind_methods() {
|
void MeshInstance3D::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("set_mesh", "mesh"), &MeshInstance3D::set_mesh);
|
ClassDB::bind_method(D_METHOD("set_mesh", "mesh"), &MeshInstance3D::set_mesh);
|
||||||
ClassDB::bind_method(D_METHOD("get_mesh"), &MeshInstance3D::get_mesh);
|
ClassDB::bind_method(D_METHOD("get_mesh"), &MeshInstance3D::get_mesh);
|
||||||
|
|||||||
@@ -104,6 +104,8 @@ public:
|
|||||||
Ref<ArrayMesh> bake_mesh_from_current_blend_shape_mix(Ref<ArrayMesh> p_existing = Ref<ArrayMesh>());
|
Ref<ArrayMesh> bake_mesh_from_current_blend_shape_mix(Ref<ArrayMesh> p_existing = Ref<ArrayMesh>());
|
||||||
Ref<ArrayMesh> bake_mesh_from_current_skeleton_pose(Ref<ArrayMesh> p_existing = Ref<ArrayMesh>());
|
Ref<ArrayMesh> bake_mesh_from_current_skeleton_pose(Ref<ArrayMesh> p_existing = Ref<ArrayMesh>());
|
||||||
|
|
||||||
|
virtual Ref<TriangleMesh> generate_triangle_mesh() const override;
|
||||||
|
|
||||||
MeshInstance3D();
|
MeshInstance3D();
|
||||||
~MeshInstance3D();
|
~MeshInstance3D();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ public:
|
|||||||
|
|
||||||
virtual AABB get_aabb() const override;
|
virtual AABB get_aabb() const override;
|
||||||
|
|
||||||
Ref<TriangleMesh> generate_triangle_mesh() const;
|
virtual Ref<TriangleMesh> generate_triangle_mesh() const override;
|
||||||
|
|
||||||
SpriteBase3D();
|
SpriteBase3D();
|
||||||
~SpriteBase3D();
|
~SpriteBase3D();
|
||||||
|
|||||||
@@ -530,6 +530,10 @@ bool GeometryInstance3D::is_ignoring_occlusion_culling() {
|
|||||||
return ignore_occlusion_culling;
|
return ignore_occlusion_culling;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<TriangleMesh> GeometryInstance3D::generate_triangle_mesh() const {
|
||||||
|
return Ref<TriangleMesh>();
|
||||||
|
}
|
||||||
|
|
||||||
PackedStringArray GeometryInstance3D::get_configuration_warnings() const {
|
PackedStringArray GeometryInstance3D::get_configuration_warnings() const {
|
||||||
PackedStringArray warnings = VisualInstance3D::get_configuration_warnings();
|
PackedStringArray warnings = VisualInstance3D::get_configuration_warnings();
|
||||||
|
|
||||||
|
|||||||
@@ -202,6 +202,8 @@ public:
|
|||||||
void set_ignore_occlusion_culling(bool p_enabled);
|
void set_ignore_occlusion_culling(bool p_enabled);
|
||||||
bool is_ignoring_occlusion_culling();
|
bool is_ignoring_occlusion_culling();
|
||||||
|
|
||||||
|
virtual Ref<TriangleMesh> generate_triangle_mesh() const;
|
||||||
|
|
||||||
PackedStringArray get_configuration_warnings() const override;
|
PackedStringArray get_configuration_warnings() const override;
|
||||||
GeometryInstance3D();
|
GeometryInstance3D();
|
||||||
virtual ~GeometryInstance3D();
|
virtual ~GeometryInstance3D();
|
||||||
|
|||||||
@@ -39,11 +39,9 @@
|
|||||||
#include "scene/2d/physics/collision_polygon_2d.h"
|
#include "scene/2d/physics/collision_polygon_2d.h"
|
||||||
#include "scene/2d/physics/collision_shape_2d.h"
|
#include "scene/2d/physics/collision_shape_2d.h"
|
||||||
#ifndef _3D_DISABLED
|
#ifndef _3D_DISABLED
|
||||||
#include "scene/3d/label_3d.h"
|
|
||||||
#include "scene/3d/mesh_instance_3d.h"
|
|
||||||
#include "scene/3d/physics/collision_object_3d.h"
|
#include "scene/3d/physics/collision_object_3d.h"
|
||||||
#include "scene/3d/physics/collision_shape_3d.h"
|
#include "scene/3d/physics/collision_shape_3d.h"
|
||||||
#include "scene/3d/sprite_3d.h"
|
#include "scene/3d/visual_instance_3d.h"
|
||||||
#include "scene/resources/surface_tool.h"
|
#include "scene/resources/surface_tool.h"
|
||||||
#endif // _3D_DISABLED
|
#endif // _3D_DISABLED
|
||||||
#include "scene/gui/popup_menu.h"
|
#include "scene/gui/popup_menu.h"
|
||||||
@@ -1896,7 +1894,7 @@ void RuntimeNodeSelect::_find_3d_items_at_pos(const Point2 &p_pos, Vector<Select
|
|||||||
if (ss->intersect_ray(ray_params, result)) {
|
if (ss->intersect_ray(ray_params, result)) {
|
||||||
SelectResult res;
|
SelectResult res;
|
||||||
res.item = Object::cast_to<Node>(result.collider);
|
res.item = Object::cast_to<Node>(result.collider);
|
||||||
res.order = -pos.distance_to(Object::cast_to<Node3D>(res.item)->get_global_transform().xform(result.position));
|
res.order = -pos.distance_to(result.position);
|
||||||
|
|
||||||
// Fetch collision shapes.
|
// Fetch collision shapes.
|
||||||
CollisionObject3D *collision = Object::cast_to<CollisionObject3D>(result.collider);
|
CollisionObject3D *collision = Object::cast_to<CollisionObject3D>(result.collider);
|
||||||
@@ -1923,28 +1921,10 @@ void RuntimeNodeSelect::_find_3d_items_at_pos(const Point2 &p_pos, Vector<Select
|
|||||||
Vector<ObjectID> items = RS::get_singleton()->instances_cull_ray(pos, to, root->get_world_3d()->get_scenario());
|
Vector<ObjectID> items = RS::get_singleton()->instances_cull_ray(pos, to, root->get_world_3d()->get_scenario());
|
||||||
for (int i = 0; i < items.size(); i++) {
|
for (int i = 0; i < items.size(); i++) {
|
||||||
Object *obj = ObjectDB::get_instance(items[i]);
|
Object *obj = ObjectDB::get_instance(items[i]);
|
||||||
GeometryInstance3D *geo_instance = nullptr;
|
|
||||||
Ref<TriangleMesh> mesh_collision;
|
|
||||||
|
|
||||||
MeshInstance3D *mesh_instance = Object::cast_to<MeshInstance3D>(obj);
|
GeometryInstance3D *geo_instance = Object::cast_to<GeometryInstance3D>(obj);
|
||||||
if (mesh_instance) {
|
if (geo_instance) {
|
||||||
if (mesh_instance->get_mesh().is_valid()) {
|
Ref<TriangleMesh> mesh_collision = geo_instance->generate_triangle_mesh();
|
||||||
geo_instance = mesh_instance;
|
|
||||||
mesh_collision = mesh_instance->get_mesh()->generate_triangle_mesh();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Label3D *label = Object::cast_to<Label3D>(obj);
|
|
||||||
if (label) {
|
|
||||||
geo_instance = label;
|
|
||||||
mesh_collision = label->generate_triangle_mesh();
|
|
||||||
} else {
|
|
||||||
Sprite3D *sprite = Object::cast_to<Sprite3D>(obj);
|
|
||||||
if (sprite) {
|
|
||||||
geo_instance = sprite;
|
|
||||||
mesh_collision = sprite->generate_triangle_mesh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mesh_collision.is_valid()) {
|
if (mesh_collision.is_valid()) {
|
||||||
Transform3D gt = geo_instance->get_global_transform();
|
Transform3D gt = geo_instance->get_global_transform();
|
||||||
@@ -1959,6 +1939,7 @@ void RuntimeNodeSelect::_find_3d_items_at_pos(const Point2 &p_pos, Vector<Select
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
items.remove_at(i);
|
items.remove_at(i);
|
||||||
i--;
|
i--;
|
||||||
|
|||||||
Reference in New Issue
Block a user