Merge pull request #2868 from akien-mga/pr-fix-can-move-to
Fix can_move_to and rename it for more clarity
This commit is contained in:
commit
ff936c6b2e
4 changed files with 16 additions and 22 deletions
|
@ -15053,14 +15053,13 @@ returns:= "username=user&password=pass"
|
|||
<description>
|
||||
</description>
|
||||
</method>
|
||||
<method name="can_move_to">
|
||||
<method name="can_teleport_to">
|
||||
<return type="bool">
|
||||
</return>
|
||||
<argument index="0" name="position" type="Vector3">
|
||||
</argument>
|
||||
<argument index="1" name="arg1" type="bool">
|
||||
</argument>
|
||||
<description>
|
||||
Returns whether the KinematicBody can be teleported to the destination given as an argument, checking all collision shapes of the body against potential colliders at the destination.
|
||||
</description>
|
||||
</method>
|
||||
<method name="is_colliding" qualifiers="const">
|
||||
|
|
|
@ -1073,7 +1073,7 @@ Vector3 KinematicBody::move_to(const Vector3& p_position) {
|
|||
return move(p_position-get_global_transform().origin);
|
||||
}
|
||||
|
||||
bool KinematicBody::can_move_to(const Vector3& p_position, bool p_discrete) {
|
||||
bool KinematicBody::can_teleport_to(const Vector3& p_position) {
|
||||
|
||||
ERR_FAIL_COND_V(!is_inside_tree(),false);
|
||||
PhysicsDirectSpaceState *dss = PhysicsServer::get_singleton()->space_get_direct_state(get_world()->get_space());
|
||||
|
@ -1089,25 +1089,18 @@ bool KinematicBody::can_move_to(const Vector3& p_position, bool p_discrete) {
|
|||
if (collide_character)
|
||||
mask|=PhysicsDirectSpaceState::TYPE_MASK_CHARACTER_BODY;
|
||||
|
||||
Vector3 motion = p_position-get_global_transform().origin;
|
||||
Transform xform=get_global_transform();
|
||||
|
||||
if (true || p_discrete) {
|
||||
|
||||
xform.origin+=motion;
|
||||
motion=Vector3();
|
||||
}
|
||||
xform.origin=p_position;
|
||||
|
||||
Set<RID> exclude;
|
||||
exclude.insert(get_rid());
|
||||
|
||||
//fill exclude list..
|
||||
for(int i=0;i<get_shape_count();i++) {
|
||||
|
||||
if (is_shape_set_as_trigger(i))
|
||||
continue;
|
||||
|
||||
bool col = dss->intersect_shape(get_shape(i)->get_rid(), xform * get_shape_transform(i),0,NULL,0,exclude,get_layer_mask(),mask);
|
||||
bool col = dss->intersect_shape(get_shape(i)->get_rid(), xform * get_shape_transform(i),0,NULL,1,exclude,get_layer_mask(),mask);
|
||||
if (col)
|
||||
return false;
|
||||
}
|
||||
|
@ -1205,7 +1198,7 @@ void KinematicBody::_bind_methods() {
|
|||
ObjectTypeDB::bind_method(_MD("move","rel_vec"),&KinematicBody::move);
|
||||
ObjectTypeDB::bind_method(_MD("move_to","position"),&KinematicBody::move_to);
|
||||
|
||||
ObjectTypeDB::bind_method(_MD("can_move_to","position"),&KinematicBody::can_move_to);
|
||||
ObjectTypeDB::bind_method(_MD("can_teleport_to","position"),&KinematicBody::can_teleport_to);
|
||||
|
||||
ObjectTypeDB::bind_method(_MD("is_colliding"),&KinematicBody::is_colliding);
|
||||
|
||||
|
|
|
@ -304,7 +304,7 @@ public:
|
|||
Vector3 move(const Vector3& p_motion);
|
||||
Vector3 move_to(const Vector3& p_position);
|
||||
|
||||
bool can_move_to(const Vector3& p_position,bool p_discrete=false);
|
||||
bool can_teleport_to(const Vector3& p_position);
|
||||
bool is_colliding() const;
|
||||
Vector3 get_collision_pos() const;
|
||||
Vector3 get_collision_normal() const;
|
||||
|
|
|
@ -175,13 +175,15 @@ int PhysicsDirectSpaceStateSW::intersect_shape(const RID& p_shape, const Transfo
|
|||
if (!CollisionSolverSW::solve_static(shape,p_xform,col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), NULL,NULL,NULL,p_margin,0))
|
||||
continue;
|
||||
|
||||
r_results[cc].collider_id=col_obj->get_instance_id();
|
||||
if (r_results[cc].collider_id!=0)
|
||||
r_results[cc].collider=ObjectDB::get_instance(r_results[cc].collider_id);
|
||||
else
|
||||
r_results[cc].collider=NULL;
|
||||
r_results[cc].rid=col_obj->get_self();
|
||||
r_results[cc].shape=shape_idx;
|
||||
if (r_results) {
|
||||
r_results[cc].collider_id=col_obj->get_instance_id();
|
||||
if (r_results[cc].collider_id!=0)
|
||||
r_results[cc].collider=ObjectDB::get_instance(r_results[cc].collider_id);
|
||||
else
|
||||
r_results[cc].collider=NULL;
|
||||
r_results[cc].rid=col_obj->get_self();
|
||||
r_results[cc].shape=shape_idx;
|
||||
}
|
||||
|
||||
cc++;
|
||||
|
||||
|
|
Loading…
Reference in a new issue