You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-18 14:21:41 +00:00
-Make sure monitorable cant be flipped while flushing queries, fixes #17330
-Also added set_deferred, this was missing.
This commit is contained in:
@@ -40,6 +40,12 @@
|
||||
#include "joints/pin_joint_sw.h"
|
||||
#include "joints/slider_joint_sw.h"
|
||||
|
||||
#define FLUSH_QUERY_CHECK \
|
||||
if (flushing_queries) { \
|
||||
ERR_EXPLAIN("Can't change this state while flushing queries. Use call_deferred()/set_deferred() to change monitoring state instead"); \
|
||||
ERR_FAIL(); \
|
||||
}
|
||||
|
||||
RID PhysicsServerSW::shape_create(ShapeType p_shape) {
|
||||
|
||||
ShapeSW *shape = NULL;
|
||||
@@ -352,6 +358,8 @@ void PhysicsServerSW::area_clear_shapes(RID p_area) {
|
||||
|
||||
void PhysicsServerSW::area_set_shape_disabled(RID p_area, int p_shape_idx, bool p_disabled) {
|
||||
|
||||
FLUSH_QUERY_CHECK
|
||||
|
||||
AreaSW *area = area_owner.get(p_area);
|
||||
ERR_FAIL_COND(!area);
|
||||
ERR_FAIL_INDEX(p_shape_idx, area->get_shape_count());
|
||||
@@ -435,6 +443,8 @@ void PhysicsServerSW::area_set_collision_mask(RID p_area, uint32_t p_mask) {
|
||||
|
||||
void PhysicsServerSW::area_set_monitorable(RID p_area, bool p_monitorable) {
|
||||
|
||||
FLUSH_QUERY_CHECK
|
||||
|
||||
AreaSW *area = area_owner.get(p_area);
|
||||
ERR_FAIL_COND(!area);
|
||||
|
||||
@@ -582,6 +592,8 @@ RID PhysicsServerSW::body_get_shape(RID p_body, int p_shape_idx) const {
|
||||
|
||||
void PhysicsServerSW::body_set_shape_disabled(RID p_body, int p_shape_idx, bool p_disabled) {
|
||||
|
||||
FLUSH_QUERY_CHECK
|
||||
|
||||
BodySW *body = body_owner.get(p_body);
|
||||
ERR_FAIL_COND(!body);
|
||||
ERR_FAIL_INDEX(p_shape_idx, body->get_shape_count());
|
||||
@@ -1459,6 +1471,8 @@ void PhysicsServerSW::flush_queries() {
|
||||
|
||||
doing_sync = true;
|
||||
|
||||
flushing_queries = true;
|
||||
|
||||
uint64_t time_beg = OS::get_singleton()->get_ticks_usec();
|
||||
|
||||
for (Set<const SpaceSW *>::Element *E = active_spaces.front(); E; E = E->next()) {
|
||||
@@ -1467,6 +1481,8 @@ void PhysicsServerSW::flush_queries() {
|
||||
space->call_queries();
|
||||
}
|
||||
|
||||
flushing_queries = false;
|
||||
|
||||
if (ScriptDebugger::get_singleton() && ScriptDebugger::get_singleton()->is_profiling()) {
|
||||
|
||||
uint64_t total_time[SpaceSW::ELAPSED_TIME_MAX];
|
||||
@@ -1580,6 +1596,7 @@ PhysicsServerSW::PhysicsServerSW() {
|
||||
collision_pairs = 0;
|
||||
|
||||
active = true;
|
||||
flushing_queries = false;
|
||||
};
|
||||
|
||||
PhysicsServerSW::~PhysicsServerSW(){
|
||||
|
||||
@@ -51,6 +51,8 @@ class PhysicsServerSW : public PhysicsServer {
|
||||
int active_objects;
|
||||
int collision_pairs;
|
||||
|
||||
bool flushing_queries;
|
||||
|
||||
StepSW *stepper;
|
||||
Set<const SpaceSW *> active_spaces;
|
||||
|
||||
@@ -365,6 +367,8 @@ public:
|
||||
virtual void flush_queries();
|
||||
virtual void finish();
|
||||
|
||||
virtual bool is_flushing_queries() const { return flushing_queries; }
|
||||
|
||||
int get_process_info(ProcessInfo p_info);
|
||||
|
||||
PhysicsServerSW();
|
||||
|
||||
@@ -36,6 +36,12 @@
|
||||
#include "core/project_settings.h"
|
||||
#include "core/script_language.h"
|
||||
|
||||
#define FLUSH_QUERY_CHECK \
|
||||
if (flushing_queries) { \
|
||||
ERR_EXPLAIN("Can't change this state while flushing queries. Use call_deferred() or set_deferred() to change monitoring state instead"); \
|
||||
ERR_FAIL(); \
|
||||
}
|
||||
|
||||
RID Physics2DServerSW::_shape_create(ShapeType p_shape) {
|
||||
|
||||
Shape2DSW *shape = NULL;
|
||||
@@ -401,6 +407,8 @@ void Physics2DServerSW::area_set_shape_transform(RID p_area, int p_shape_idx, co
|
||||
|
||||
void Physics2DServerSW::area_set_shape_disabled(RID p_area, int p_shape, bool p_disabled) {
|
||||
|
||||
FLUSH_QUERY_CHECK
|
||||
|
||||
Area2DSW *area = area_owner.get(p_area);
|
||||
ERR_FAIL_COND(!area);
|
||||
|
||||
@@ -539,6 +547,8 @@ void Physics2DServerSW::area_set_pickable(RID p_area, bool p_pickable) {
|
||||
|
||||
void Physics2DServerSW::area_set_monitorable(RID p_area, bool p_monitorable) {
|
||||
|
||||
FLUSH_QUERY_CHECK
|
||||
|
||||
Area2DSW *area = area_owner.get(p_area);
|
||||
ERR_FAIL_COND(!area);
|
||||
|
||||
@@ -617,6 +627,8 @@ RID Physics2DServerSW::body_get_space(RID p_body) const {
|
||||
|
||||
void Physics2DServerSW::body_set_mode(RID p_body, BodyMode p_mode) {
|
||||
|
||||
FLUSH_QUERY_CHECK
|
||||
|
||||
Body2DSW *body = body_owner.get(p_body);
|
||||
ERR_FAIL_COND(!body);
|
||||
|
||||
@@ -719,6 +731,8 @@ void Physics2DServerSW::body_clear_shapes(RID p_body) {
|
||||
|
||||
void Physics2DServerSW::body_set_shape_disabled(RID p_body, int p_shape_idx, bool p_disabled) {
|
||||
|
||||
FLUSH_QUERY_CHECK
|
||||
|
||||
Body2DSW *body = body_owner.get(p_body);
|
||||
ERR_FAIL_COND(!body);
|
||||
|
||||
@@ -1348,6 +1362,8 @@ void Physics2DServerSW::flush_queries() {
|
||||
if (!active)
|
||||
return;
|
||||
|
||||
flushing_queries = true;
|
||||
|
||||
uint64_t time_beg = OS::get_singleton()->get_ticks_usec();
|
||||
|
||||
for (Set<const Space2DSW *>::Element *E = active_spaces.front(); E; E = E->next()) {
|
||||
@@ -1356,6 +1372,8 @@ void Physics2DServerSW::flush_queries() {
|
||||
space->call_queries();
|
||||
}
|
||||
|
||||
flushing_queries = false;
|
||||
|
||||
if (ScriptDebugger::get_singleton() && ScriptDebugger::get_singleton()->is_profiling()) {
|
||||
|
||||
uint64_t total_time[Space2DSW::ELAPSED_TIME_MAX];
|
||||
@@ -1434,6 +1452,7 @@ Physics2DServerSW::Physics2DServerSW() {
|
||||
active_objects = 0;
|
||||
collision_pairs = 0;
|
||||
using_threads = int(ProjectSettings::get_singleton()->get("physics/2d/thread_model")) == 2;
|
||||
flushing_queries = false;
|
||||
};
|
||||
|
||||
Physics2DServerSW::~Physics2DServerSW(){
|
||||
|
||||
@@ -54,6 +54,8 @@ class Physics2DServerSW : public Physics2DServer {
|
||||
|
||||
bool using_threads;
|
||||
|
||||
bool flushing_queries;
|
||||
|
||||
Step2DSW *stepper;
|
||||
Set<const Space2DSW *> active_spaces;
|
||||
|
||||
@@ -278,6 +280,8 @@ public:
|
||||
virtual void end_sync();
|
||||
virtual void finish();
|
||||
|
||||
virtual bool is_flushing_queries() const { return flushing_queries; }
|
||||
|
||||
int get_process_info(ProcessInfo p_info);
|
||||
|
||||
Physics2DServerSW();
|
||||
|
||||
@@ -312,6 +312,10 @@ public:
|
||||
virtual void flush_queries();
|
||||
virtual void finish();
|
||||
|
||||
virtual bool is_flushing_queries() const {
|
||||
return physics_2d_server->is_flushing_queries();
|
||||
}
|
||||
|
||||
int get_process_info(ProcessInfo p_info) {
|
||||
return physics_2d_server->get_process_info(p_info);
|
||||
}
|
||||
|
||||
@@ -584,6 +584,8 @@ public:
|
||||
virtual void end_sync() = 0;
|
||||
virtual void finish() = 0;
|
||||
|
||||
virtual bool is_flushing_queries() const = 0;
|
||||
|
||||
enum ProcessInfo {
|
||||
|
||||
INFO_ACTIVE_OBJECTS,
|
||||
|
||||
@@ -744,6 +744,8 @@ public:
|
||||
virtual void flush_queries() = 0;
|
||||
virtual void finish() = 0;
|
||||
|
||||
virtual bool is_flushing_queries() const = 0;
|
||||
|
||||
enum ProcessInfo {
|
||||
|
||||
INFO_ACTIVE_OBJECTS,
|
||||
|
||||
Reference in New Issue
Block a user