diff options
Diffstat (limited to 'modules/bullet/collision_object_bullet.cpp')
| -rw-r--r-- | modules/bullet/collision_object_bullet.cpp | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/modules/bullet/collision_object_bullet.cpp b/modules/bullet/collision_object_bullet.cpp index 88d4108f82..b3dfc2eecf 100644 --- a/modules/bullet/collision_object_bullet.cpp +++ b/modules/bullet/collision_object_bullet.cpp @@ -1,13 +1,12 @@ /*************************************************************************/ /* collision_object_bullet.cpp */ -/* Author: AndreaCatania */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ -/* http://www.godotengine.org */ +/* https://godotengine.org */ /*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ +/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ @@ -30,14 +29,20 @@ /*************************************************************************/ #include "collision_object_bullet.h" + #include "area_bullet.h" -#include "btBulletCollisionCommon.h" #include "bullet_physics_server.h" #include "bullet_types_converter.h" #include "bullet_utilities.h" #include "shape_bullet.h" #include "space_bullet.h" +#include <btBulletCollisionCommon.h> + +/** + @author AndreaCatania +*/ + #define enableDynamicAabbTree true #define initialChildCapacity 1 @@ -57,7 +62,8 @@ CollisionObjectBullet::CollisionObjectBullet(Type p_type) : collisionsEnabled(true), m_isStatic(false), bt_collision_object(NULL), - body_scale(1., 1., 1.) {} + body_scale(1., 1., 1.), + force_shape_reset(false) {} CollisionObjectBullet::~CollisionObjectBullet() { // Remove all overlapping @@ -88,6 +94,7 @@ btVector3 CollisionObjectBullet::get_bt_body_scale() const { } void CollisionObjectBullet::on_body_scale_changed() { + force_shape_reset = true; } void CollisionObjectBullet::destroyBulletCollisionObject() { @@ -289,15 +296,27 @@ void RigidCollisionObjectBullet::on_shape_changed(const ShapeBullet *const p_sha void RigidCollisionObjectBullet::on_shapes_changed() { int i; + // Remove all shapes, reverse order for performance reason (Array resize) for (i = compoundShape->getNumChildShapes() - 1; 0 <= i; --i) { compoundShape->removeChildShapeByIndex(i); } - // Insert all shapes ShapeWrapper *shpWrapper; - const int size = shapes.size(); - for (i = 0; i < size; ++i) { + const int shapes_size = shapes.size(); + + // Reset shape if required + if (force_shape_reset) { + for (i = 0; i < shapes_size; ++i) { + shpWrapper = &shapes[i]; + bulletdelete(shpWrapper->bt_shape); + } + force_shape_reset = false; + } + + // Insert all shapes + + for (i = 0; i < shapes_size; ++i) { shpWrapper = &shapes[i]; if (shpWrapper->active) { if (!shpWrapper->bt_shape) { |