VehicleWheel can now return the surface it's colliding with.

Fixed PR issues.

Update vehicle_body_3d.cpp

Apply suggestions from code review

Co-authored-by: Camille Mohr-Daurat <pouleyKetchoup@gmail.com>
(cherry picked from commit 0c352407d8)
This commit is contained in:
Steve Szilágyi 2021-12-08 12:10:56 +01:00 committed by Rémi Verschelde
parent 3e41e8dfa0
commit 285b816f1f
No known key found for this signature in database
GPG key ID: C3336907360768E1
3 changed files with 16 additions and 2 deletions

View file

@ -11,6 +11,13 @@
<link title="3D Truck Town Demo">https://godotengine.org/asset-library/asset/524</link>
</tutorials>
<methods>
<method name="get_contact_body" qualifiers="const">
<return type="Spatial" />
<description>
Returns the contacting body node if valid in the tree, as [Spatial]. At the moment, [GridMap] is not supported so the node will be always of type [PhysicsBody].
Returns [code]null[/code] if the wheel is not in contact with a surface, or the contact body is not a [PhysicsBody].
</description>
</method>
<method name="get_rpm" qualifiers="const">
<return type="float" />
<description>

View file

@ -217,6 +217,10 @@ bool VehicleWheel::is_in_contact() const {
return m_raycastInfo.m_isInContact;
}
Spatial *VehicleWheel::get_contact_body() const {
return m_raycastInfo.m_groundObject;
}
void VehicleWheel::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_radius", "length"), &VehicleWheel::set_radius);
ClassDB::bind_method(D_METHOD("get_radius"), &VehicleWheel::get_radius);
@ -249,6 +253,7 @@ void VehicleWheel::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_friction_slip"), &VehicleWheel::get_friction_slip);
ClassDB::bind_method(D_METHOD("is_in_contact"), &VehicleWheel::is_in_contact);
ClassDB::bind_method(D_METHOD("get_contact_body"), &VehicleWheel::get_contact_body);
ClassDB::bind_method(D_METHOD("set_roll_influence", "roll_influence"), &VehicleWheel::set_roll_influence);
ClassDB::bind_method(D_METHOD("get_roll_influence"), &VehicleWheel::get_roll_influence);
@ -357,6 +362,7 @@ VehicleWheel::VehicleWheel() {
m_suspensionRelativeVelocity = 0;
m_clippedInvContactDotSuspension = 1.0;
m_raycastInfo.m_isInContact = false;
m_raycastInfo.m_groundObject = nullptr;
m_raycastInfo.m_suspensionLength = 0.0;
body = nullptr;
@ -423,9 +429,8 @@ real_t VehicleBody::_ray_cast(int p_idx, PhysicsDirectBodyState *s) {
PhysicsDirectSpaceState *ss = s->get_space_state();
bool col = ss->intersect_ray(source, target, rr, exclude, get_collision_mask());
wheel.m_raycastInfo.m_groundObject = nullptr;
bool col = ss->intersect_ray(source, target, rr, exclude, get_collision_mask());
if (col) {
param = source.distance_to(rr.position) / source.distance_to(target);

View file

@ -129,6 +129,8 @@ public:
bool is_in_contact() const;
Spatial *get_contact_body() const;
void set_roll_influence(float p_value);
float get_roll_influence() const;