Merge pull request #50257 from Calinou/physicsserver3d-add-set-iterations-3.x

Add a method to set the number of physics solver iterations in 3D (3.x)
This commit is contained in:
Rémi Verschelde 2021-07-14 07:56:57 +02:00 committed by GitHub
commit b0b2b7df31
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 28 additions and 2 deletions

View File

@ -1009,7 +1009,7 @@
<argument index="0" name="iterations" type="int"> <argument index="0" name="iterations" type="int">
</argument> </argument>
<description> <description>
Sets the amount of iterations for calculating velocities of colliding bodies. The greater the amount, the more accurate the collisions, but with a performance loss. Sets the amount of iterations for calculating velocities of colliding bodies. The greater the amount of iterations, the more accurate the collisions will be. However, a greater amount of iterations requires more CPU power, which can decrease performance. The default value is [code]8[/code].
</description> </description>
</method> </method>
<method name="shape_get_data" qualifiers="const"> <method name="shape_get_data" qualifiers="const">

View File

@ -1155,6 +1155,16 @@
Activates or deactivates the 3D physics engine. Activates or deactivates the 3D physics engine.
</description> </description>
</method> </method>
<method name="set_collision_iterations">
<return type="void">
</return>
<argument index="0" name="iterations" type="int">
</argument>
<description>
Sets the amount of iterations for calculating velocities of colliding bodies. The greater the amount of iterations, the more accurate the collisions will be. However, a greater amount of iterations requires more CPU power, which can decrease performance. The default value is [code]8[/code].
[b]Note:[/b] Only has an effect when using the GodotPhysics engine, not the default Bullet physics engine.
</description>
</method>
<method name="shape_create"> <method name="shape_create">
<return type="RID"> <return type="RID">
</return> </return>

View File

@ -1546,6 +1546,10 @@ void BulletPhysicsServer::finish() {
BulletPhysicsDirectBodyState::destroySingleton(); BulletPhysicsDirectBodyState::destroySingleton();
} }
void BulletPhysicsServer::set_collision_iterations(int p_iterations) {
WARN_PRINT("Changing the number of 3D physics collision iterations is only supported when using GodotPhysics, not Bullet.");
}
int BulletPhysicsServer::get_process_info(ProcessInfo p_info) { int BulletPhysicsServer::get_process_info(ProcessInfo p_info) {
return 0; return 0;
} }

View File

@ -398,6 +398,8 @@ public:
virtual bool is_flushing_queries() const { return false; } virtual bool is_flushing_queries() const { return false; }
virtual void set_collision_iterations(int p_iterations);
virtual int get_process_info(ProcessInfo p_info); virtual int get_process_info(ProcessInfo p_info);
CollisionObjectBullet *get_collision_object(RID p_object) const; CollisionObjectBullet *get_collision_object(RID p_object) const;

View File

@ -1274,6 +1274,10 @@ void PhysicsServerSW::set_active(bool p_active) {
active = p_active; active = p_active;
}; };
void PhysicsServerSW::set_collision_iterations(int p_iterations) {
iterations = p_iterations;
};
void PhysicsServerSW::init() { void PhysicsServerSW::init() {
last_step = 0.001; last_step = 0.001;
iterations = 8; // 8? iterations = 8; // 8?

View File

@ -363,6 +363,8 @@ public:
virtual void flush_queries(); virtual void flush_queries();
virtual void finish(); virtual void finish();
virtual void set_collision_iterations(int p_iterations);
virtual bool is_flushing_queries() const { return flushing_queries; } virtual bool is_flushing_queries() const { return flushing_queries; }
int get_process_info(ProcessInfo p_info); int get_process_info(ProcessInfo p_info);

View File

@ -555,7 +555,7 @@ public:
virtual bool is_flushing_queries() const = 0; virtual bool is_flushing_queries() const = 0;
virtual void set_collision_iterations(int iterations) = 0; virtual void set_collision_iterations(int p_iterations) = 0;
enum ProcessInfo { enum ProcessInfo {

View File

@ -671,6 +671,8 @@ void PhysicsServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_active", "active"), &PhysicsServer::set_active); ClassDB::bind_method(D_METHOD("set_active", "active"), &PhysicsServer::set_active);
ClassDB::bind_method(D_METHOD("set_collision_iterations", "iterations"), &PhysicsServer::set_collision_iterations);
ClassDB::bind_method(D_METHOD("get_process_info", "process_info"), &PhysicsServer::get_process_info); ClassDB::bind_method(D_METHOD("get_process_info", "process_info"), &PhysicsServer::get_process_info);
BIND_ENUM_CONSTANT(SHAPE_PLANE); BIND_ENUM_CONSTANT(SHAPE_PLANE);

View File

@ -726,6 +726,8 @@ public:
virtual bool is_flushing_queries() const = 0; virtual bool is_flushing_queries() const = 0;
virtual void set_collision_iterations(int p_iterations) = 0;
enum ProcessInfo { enum ProcessInfo {
INFO_ACTIVE_OBJECTS, INFO_ACTIVE_OBJECTS,