summaryrefslogtreecommitdiff
path: root/servers/physics
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2017-10-09 11:01:36 +0200
committerGitHub <noreply@github.com>2017-10-09 11:01:36 +0200
commit8e9b99fe59a360c0c9822e8e3e8f53afd1a72b5c (patch)
tree63645c75c3ab6ea2b8052e32870a21a8194fda83 /servers/physics
parent30a4882cf808f04a80bf0b6a3c879c8e9a74f673 (diff)
parentc56c67db39b619d37c503e41e718f9cda39c3f0e (diff)
Merge pull request #11702 from AndreaCatania/bodyDS
Added new API to get body direct state
Diffstat (limited to 'servers/physics')
-rw-r--r--servers/physics/physics_server_sw.cpp15
-rw-r--r--servers/physics/physics_server_sw.h3
2 files changed, 18 insertions, 0 deletions
diff --git a/servers/physics/physics_server_sw.cpp b/servers/physics/physics_server_sw.cpp
index 1553c3c8e6..a7c31cf16c 100644
--- a/servers/physics/physics_server_sw.cpp
+++ b/servers/physics/physics_server_sw.cpp
@@ -914,6 +914,21 @@ bool PhysicsServerSW::body_test_motion(RID p_body, const Transform &p_from, cons
return body->get_space()->test_body_motion(body, p_from, p_motion, p_margin, r_result);
}
+PhysicsDirectBodyState *PhysicsServerSW::body_get_direct_state(RID p_body) {
+
+ BodySW *body = body_owner.get(p_body);
+ ERR_FAIL_COND_V(!body, NULL);
+
+ if (!doing_sync || body->get_space()->is_locked()) {
+
+ ERR_EXPLAIN("Body state is inaccessible right now, wait for iteration or physics process notification.");
+ ERR_FAIL_V(NULL);
+ }
+
+ direct_state->body = body;
+ return direct_state;
+}
+
/* JOINT API */
RID PhysicsServerSW::joint_create_pin(RID p_body_A, const Vector3 &p_local_A, RID p_body_B, const Vector3 &p_local_B) {
diff --git a/servers/physics/physics_server_sw.h b/servers/physics/physics_server_sw.h
index aea3e150b0..f9eb8fa454 100644
--- a/servers/physics/physics_server_sw.h
+++ b/servers/physics/physics_server_sw.h
@@ -223,6 +223,9 @@ public:
virtual bool body_test_motion(RID p_body, const Transform &p_from, const Vector3 &p_motion, float p_margin = 0.001, MotionResult *r_result = NULL);
+ // this function only works on physics process, errors and returns null otherwise
+ virtual PhysicsDirectBodyState *body_get_direct_state(RID p_body);
+
/* JOINT API */
virtual RID joint_create_pin(RID p_body_A, const Vector3 &p_local_A, RID p_body_B, const Vector3 &p_local_B);