mirror of
https://github.com/godotengine/godot
synced 2024-09-15 23:46:15 +00:00
Merge pull request #53311 from nekomatata/soft-body-remove-mesh-reference
Remove scene code in physics servers
This commit is contained in:
commit
fdd25d7c84
|
@ -903,7 +903,7 @@ RID BulletPhysicsServer3D::soft_body_get_space(RID p_body) const {
|
||||||
return space->get_self();
|
return space->get_self();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BulletPhysicsServer3D::soft_body_set_mesh(RID p_body, const REF &p_mesh) {
|
void BulletPhysicsServer3D::soft_body_set_mesh(RID p_body, RID p_mesh) {
|
||||||
SoftBodyBullet *body = soft_body_owner.get_or_null(p_body);
|
SoftBodyBullet *body = soft_body_owner.get_or_null(p_body);
|
||||||
ERR_FAIL_COND(!body);
|
ERR_FAIL_COND(!body);
|
||||||
|
|
||||||
|
|
|
@ -265,7 +265,7 @@ public:
|
||||||
virtual void soft_body_set_space(RID p_body, RID p_space) override;
|
virtual void soft_body_set_space(RID p_body, RID p_space) override;
|
||||||
virtual RID soft_body_get_space(RID p_body) const override;
|
virtual RID soft_body_get_space(RID p_body) const override;
|
||||||
|
|
||||||
virtual void soft_body_set_mesh(RID p_body, const REF &p_mesh) override;
|
virtual void soft_body_set_mesh(RID p_body, RID p_mesh) override;
|
||||||
|
|
||||||
virtual AABB soft_body_get_bounds(RID p_body) const override;
|
virtual AABB soft_body_get_bounds(RID p_body) const override;
|
||||||
|
|
||||||
|
|
|
@ -32,9 +32,10 @@
|
||||||
|
|
||||||
#include "bullet_types_converter.h"
|
#include "bullet_types_converter.h"
|
||||||
#include "bullet_utilities.h"
|
#include "bullet_utilities.h"
|
||||||
#include "scene/3d/soft_body_3d.h"
|
|
||||||
#include "space_bullet.h"
|
#include "space_bullet.h"
|
||||||
|
|
||||||
|
#include "servers/rendering_server.h"
|
||||||
|
|
||||||
SoftBodyBullet::SoftBodyBullet() :
|
SoftBodyBullet::SoftBodyBullet() :
|
||||||
CollisionObjectBullet(CollisionObjectBullet::TYPE_SOFT_BODY) {}
|
CollisionObjectBullet(CollisionObjectBullet::TYPE_SOFT_BODY) {}
|
||||||
|
|
||||||
|
@ -105,24 +106,26 @@ void SoftBodyBullet::update_rendering_server(RenderingServerHandler *p_rendering
|
||||||
p_rendering_server_handler->set_aabb(aabb);
|
p_rendering_server_handler->set_aabb(aabb);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoftBodyBullet::set_soft_mesh(const Ref<Mesh> &p_mesh) {
|
void SoftBodyBullet::set_soft_mesh(RID p_mesh) {
|
||||||
if (p_mesh.is_null()) {
|
destroy_soft_body();
|
||||||
soft_mesh.unref();
|
|
||||||
} else {
|
soft_mesh = p_mesh;
|
||||||
soft_mesh = p_mesh;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (soft_mesh.is_null()) {
|
if (soft_mesh.is_null()) {
|
||||||
destroy_soft_body();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Array arrays = soft_mesh->surface_get_arrays(0);
|
Array arrays = RenderingServer::get_singleton()->mesh_surface_get_arrays(soft_mesh, 0);
|
||||||
ERR_FAIL_COND(!(soft_mesh->surface_get_format(0) & RS::ARRAY_FORMAT_INDEX));
|
|
||||||
set_trimesh_body_shape(arrays[RS::ARRAY_INDEX], arrays[RS::ARRAY_VERTEX]);
|
bool success = set_trimesh_body_shape(arrays[RS::ARRAY_INDEX], arrays[RS::ARRAY_VERTEX]);
|
||||||
|
if (!success) {
|
||||||
|
destroy_soft_body();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoftBodyBullet::destroy_soft_body() {
|
void SoftBodyBullet::destroy_soft_body() {
|
||||||
|
soft_mesh = RID();
|
||||||
|
|
||||||
if (!bt_soft_body) {
|
if (!bt_soft_body) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -289,9 +292,9 @@ void SoftBodyBullet::set_drag_coefficient(real_t p_val) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoftBodyBullet::set_trimesh_body_shape(Vector<int> p_indices, Vector<Vector3> p_vertices) {
|
bool SoftBodyBullet::set_trimesh_body_shape(Vector<int> p_indices, Vector<Vector3> p_vertices) {
|
||||||
/// Assert the current soft body is destroyed
|
ERR_FAIL_COND_V(p_indices.is_empty(), false);
|
||||||
destroy_soft_body();
|
ERR_FAIL_COND_V(p_vertices.is_empty(), false);
|
||||||
|
|
||||||
/// Parse visual server indices to physical indices.
|
/// Parse visual server indices to physical indices.
|
||||||
/// Merge all overlapping vertices and create a map of physical vertices to visual server
|
/// Merge all overlapping vertices and create a map of physical vertices to visual server
|
||||||
|
@ -363,6 +366,8 @@ void SoftBodyBullet::set_trimesh_body_shape(Vector<int> p_indices, Vector<Vector
|
||||||
bt_soft_body = btSoftBodyHelpers::CreateFromTriMesh(fake_world_info, &bt_vertices[0], &bt_triangles[0], triangles_size, false);
|
bt_soft_body = btSoftBodyHelpers::CreateFromTriMesh(fake_world_info, &bt_vertices[0], &bt_triangles[0], triangles_size, false);
|
||||||
setup_soft_body();
|
setup_soft_body();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoftBodyBullet::setup_soft_body() {
|
void SoftBodyBullet::setup_soft_body() {
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
#define SOFT_BODY_BULLET_H
|
#define SOFT_BODY_BULLET_H
|
||||||
|
|
||||||
#include "collision_object_bullet.h"
|
#include "collision_object_bullet.h"
|
||||||
#include "scene/resources/material.h" // TODO remove this please
|
|
||||||
|
|
||||||
#ifdef None
|
#ifdef None
|
||||||
/// This is required to remove the macro None defined by x11 compiler because this word "None" is used internally by Bullet
|
/// This is required to remove the macro None defined by x11 compiler because this word "None" is used internally by Bullet
|
||||||
|
@ -42,7 +41,6 @@
|
||||||
|
|
||||||
#include "BulletSoftBody/btSoftBodyHelpers.h"
|
#include "BulletSoftBody/btSoftBodyHelpers.h"
|
||||||
#include "collision_object_bullet.h"
|
#include "collision_object_bullet.h"
|
||||||
#include "scene/resources/mesh.h"
|
|
||||||
#include "servers/physics_server_3d.h"
|
#include "servers/physics_server_3d.h"
|
||||||
|
|
||||||
#ifdef x11_None
|
#ifdef x11_None
|
||||||
|
@ -64,7 +62,7 @@ private:
|
||||||
btSoftBody::Material *mat0 = nullptr; // This is just a copy of pointer managed by btSoftBody
|
btSoftBody::Material *mat0 = nullptr; // This is just a copy of pointer managed by btSoftBody
|
||||||
bool isScratched = false;
|
bool isScratched = false;
|
||||||
|
|
||||||
Ref<Mesh> soft_mesh;
|
RID soft_mesh;
|
||||||
|
|
||||||
int simulation_precision = 5;
|
int simulation_precision = 5;
|
||||||
real_t total_mass = 1.;
|
real_t total_mass = 1.;
|
||||||
|
@ -100,7 +98,7 @@ public:
|
||||||
|
|
||||||
void update_rendering_server(RenderingServerHandler *p_rendering_server_handler);
|
void update_rendering_server(RenderingServerHandler *p_rendering_server_handler);
|
||||||
|
|
||||||
void set_soft_mesh(const Ref<Mesh> &p_mesh);
|
void set_soft_mesh(RID p_mesh);
|
||||||
void destroy_soft_body();
|
void destroy_soft_body();
|
||||||
|
|
||||||
// Special function. This function has bad performance
|
// Special function. This function has bad performance
|
||||||
|
@ -139,7 +137,7 @@ public:
|
||||||
_FORCE_INLINE_ real_t get_drag_coefficient() const { return drag_coefficient; }
|
_FORCE_INLINE_ real_t get_drag_coefficient() const { return drag_coefficient; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void set_trimesh_body_shape(Vector<int> p_indices, Vector<Vector3> p_vertices);
|
bool set_trimesh_body_shape(Vector<int> p_indices, Vector<Vector3> p_vertices);
|
||||||
void setup_soft_body();
|
void setup_soft_body();
|
||||||
|
|
||||||
void pin_node(int p_node_index);
|
void pin_node(int p_node_index);
|
||||||
|
|
|
@ -433,9 +433,9 @@ void SoftDynamicBody3D::prepare_physics_server() {
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
if (Engine::get_singleton()->is_editor_hint()) {
|
if (Engine::get_singleton()->is_editor_hint()) {
|
||||||
if (get_mesh().is_valid()) {
|
if (get_mesh().is_valid()) {
|
||||||
PhysicsServer3D::get_singleton()->soft_body_set_mesh(physics_rid, get_mesh());
|
PhysicsServer3D::get_singleton()->soft_body_set_mesh(physics_rid, get_mesh()->get_rid());
|
||||||
} else {
|
} else {
|
||||||
PhysicsServer3D::get_singleton()->soft_body_set_mesh(physics_rid, nullptr);
|
PhysicsServer3D::get_singleton()->soft_body_set_mesh(physics_rid, RID());
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -444,10 +444,10 @@ void SoftDynamicBody3D::prepare_physics_server() {
|
||||||
|
|
||||||
if (get_mesh().is_valid() && (is_enabled() || (disable_mode != DISABLE_MODE_REMOVE))) {
|
if (get_mesh().is_valid() && (is_enabled() || (disable_mode != DISABLE_MODE_REMOVE))) {
|
||||||
become_mesh_owner();
|
become_mesh_owner();
|
||||||
PhysicsServer3D::get_singleton()->soft_body_set_mesh(physics_rid, get_mesh());
|
PhysicsServer3D::get_singleton()->soft_body_set_mesh(physics_rid, get_mesh()->get_rid());
|
||||||
RS::get_singleton()->connect("frame_pre_draw", callable_mp(this, &SoftDynamicBody3D::_draw_soft_mesh));
|
RS::get_singleton()->connect("frame_pre_draw", callable_mp(this, &SoftDynamicBody3D::_draw_soft_mesh));
|
||||||
} else {
|
} else {
|
||||||
PhysicsServer3D::get_singleton()->soft_body_set_mesh(physics_rid, nullptr);
|
PhysicsServer3D::get_singleton()->soft_body_set_mesh(physics_rid, RID());
|
||||||
if (RS::get_singleton()->is_connected("frame_pre_draw", callable_mp(this, &SoftDynamicBody3D::_draw_soft_mesh))) {
|
if (RS::get_singleton()->is_connected("frame_pre_draw", callable_mp(this, &SoftDynamicBody3D::_draw_soft_mesh))) {
|
||||||
RS::get_singleton()->disconnect("frame_pre_draw", callable_mp(this, &SoftDynamicBody3D::_draw_soft_mesh));
|
RS::get_singleton()->disconnect("frame_pre_draw", callable_mp(this, &SoftDynamicBody3D::_draw_soft_mesh));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1098,7 +1098,7 @@ real_t PhysicsServer3DSW::soft_body_get_drag_coefficient(RID p_body) const {
|
||||||
return soft_body->get_drag_coefficient();
|
return soft_body->get_drag_coefficient();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsServer3DSW::soft_body_set_mesh(RID p_body, const REF &p_mesh) {
|
void PhysicsServer3DSW::soft_body_set_mesh(RID p_body, RID p_mesh) {
|
||||||
SoftBody3DSW *soft_body = soft_body_owner.get_or_null(p_body);
|
SoftBody3DSW *soft_body = soft_body_owner.get_or_null(p_body);
|
||||||
ERR_FAIL_COND(!soft_body);
|
ERR_FAIL_COND(!soft_body);
|
||||||
|
|
||||||
|
|
|
@ -291,7 +291,7 @@ public:
|
||||||
virtual void soft_body_set_drag_coefficient(RID p_body, real_t p_drag_coefficient) override;
|
virtual void soft_body_set_drag_coefficient(RID p_body, real_t p_drag_coefficient) override;
|
||||||
virtual real_t soft_body_get_drag_coefficient(RID p_body) const override;
|
virtual real_t soft_body_get_drag_coefficient(RID p_body) const override;
|
||||||
|
|
||||||
virtual void soft_body_set_mesh(RID p_body, const REF &p_mesh) override;
|
virtual void soft_body_set_mesh(RID p_body, RID p_mesh) override;
|
||||||
|
|
||||||
virtual AABB soft_body_get_bounds(RID p_body) const override;
|
virtual AABB soft_body_get_bounds(RID p_body) const override;
|
||||||
|
|
||||||
|
|
|
@ -308,7 +308,7 @@ public:
|
||||||
FUNC2(soft_body_set_drag_coefficient, RID, real_t);
|
FUNC2(soft_body_set_drag_coefficient, RID, real_t);
|
||||||
FUNC1RC(real_t, soft_body_get_drag_coefficient, RID);
|
FUNC1RC(real_t, soft_body_get_drag_coefficient, RID);
|
||||||
|
|
||||||
FUNC2(soft_body_set_mesh, RID, const REF &);
|
FUNC2(soft_body_set_mesh, RID, RID);
|
||||||
|
|
||||||
FUNC1RC(AABB, soft_body_get_bounds, RID);
|
FUNC1RC(AABB, soft_body_get_bounds, RID);
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
|
|
||||||
#include "core/math/geometry_3d.h"
|
#include "core/math/geometry_3d.h"
|
||||||
#include "core/templates/map.h"
|
#include "core/templates/map.h"
|
||||||
|
#include "servers/rendering_server.h"
|
||||||
|
|
||||||
// Based on Bullet soft body.
|
// Based on Bullet soft body.
|
||||||
|
|
||||||
|
@ -127,7 +128,7 @@ void SoftBody3DSW::set_space(Space3DSW *p_space) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoftBody3DSW::set_mesh(const Ref<Mesh> &p_mesh) {
|
void SoftBody3DSW::set_mesh(RID p_mesh) {
|
||||||
destroy();
|
destroy();
|
||||||
|
|
||||||
soft_mesh = p_mesh;
|
soft_mesh = p_mesh;
|
||||||
|
@ -136,13 +137,11 @@ void SoftBody3DSW::set_mesh(const Ref<Mesh> &p_mesh) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Array arrays = soft_mesh->surface_get_arrays(0);
|
Array arrays = RenderingServer::get_singleton()->mesh_surface_get_arrays(soft_mesh, 0);
|
||||||
ERR_FAIL_COND(!(soft_mesh->surface_get_format(0) & RS::ARRAY_FORMAT_INDEX));
|
|
||||||
|
|
||||||
bool success = create_from_trimesh(arrays[RS::ARRAY_INDEX], arrays[RS::ARRAY_VERTEX]);
|
bool success = create_from_trimesh(arrays[RenderingServer::ARRAY_INDEX], arrays[RenderingServer::ARRAY_VERTEX]);
|
||||||
if (!success) {
|
if (!success) {
|
||||||
destroy();
|
destroy();
|
||||||
soft_mesh = Ref<Mesh>();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -467,6 +466,9 @@ Vector3 SoftBody3DSW::get_face_normal(uint32_t p_face_index) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SoftBody3DSW::create_from_trimesh(const Vector<int> &p_indices, const Vector<Vector3> &p_vertices) {
|
bool SoftBody3DSW::create_from_trimesh(const Vector<int> &p_indices, const Vector<Vector3> &p_vertices) {
|
||||||
|
ERR_FAIL_COND_V(p_indices.is_empty(), false);
|
||||||
|
ERR_FAIL_COND_V(p_vertices.is_empty(), false);
|
||||||
|
|
||||||
uint32_t node_count = 0;
|
uint32_t node_count = 0;
|
||||||
LocalVector<Vector3> vertices;
|
LocalVector<Vector3> vertices;
|
||||||
const int visual_vertex_count(p_vertices.size());
|
const int visual_vertex_count(p_vertices.size());
|
||||||
|
@ -1227,6 +1229,8 @@ void SoftBody3DSW::deinitialize_shape() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoftBody3DSW::destroy() {
|
void SoftBody3DSW::destroy() {
|
||||||
|
soft_mesh = RID();
|
||||||
|
|
||||||
map_visual_to_physics.clear();
|
map_visual_to_physics.clear();
|
||||||
|
|
||||||
node_tree.clear();
|
node_tree.clear();
|
||||||
|
|
|
@ -40,12 +40,11 @@
|
||||||
#include "core/templates/local_vector.h"
|
#include "core/templates/local_vector.h"
|
||||||
#include "core/templates/set.h"
|
#include "core/templates/set.h"
|
||||||
#include "core/templates/vset.h"
|
#include "core/templates/vset.h"
|
||||||
#include "scene/resources/mesh.h"
|
|
||||||
|
|
||||||
class Constraint3DSW;
|
class Constraint3DSW;
|
||||||
|
|
||||||
class SoftBody3DSW : public CollisionObject3DSW {
|
class SoftBody3DSW : public CollisionObject3DSW {
|
||||||
Ref<Mesh> soft_mesh;
|
RID soft_mesh;
|
||||||
|
|
||||||
struct Node {
|
struct Node {
|
||||||
Vector3 s; // Source position
|
Vector3 s; // Source position
|
||||||
|
@ -159,7 +158,7 @@ public:
|
||||||
|
|
||||||
virtual void set_space(Space3DSW *p_space);
|
virtual void set_space(Space3DSW *p_space);
|
||||||
|
|
||||||
void set_mesh(const Ref<Mesh> &p_mesh);
|
void set_mesh(RID p_mesh);
|
||||||
|
|
||||||
void update_rendering_server(RenderingServerHandler *p_rendering_server_handler);
|
void update_rendering_server(RenderingServerHandler *p_rendering_server_handler);
|
||||||
|
|
||||||
|
|
|
@ -520,7 +520,7 @@ public:
|
||||||
virtual void soft_body_set_space(RID p_body, RID p_space) = 0;
|
virtual void soft_body_set_space(RID p_body, RID p_space) = 0;
|
||||||
virtual RID soft_body_get_space(RID p_body) const = 0;
|
virtual RID soft_body_get_space(RID p_body) const = 0;
|
||||||
|
|
||||||
virtual void soft_body_set_mesh(RID p_body, const REF &p_mesh) = 0;
|
virtual void soft_body_set_mesh(RID p_body, RID p_mesh) = 0;
|
||||||
|
|
||||||
virtual AABB soft_body_get_bounds(RID p_body) const = 0;
|
virtual AABB soft_body_get_bounds(RID p_body) const = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue