Expose bullet shape margin to UI.
The margin value is exposed into the UI for shape ressource. This value can be modified through set_margin and get from get_margin or by using the property margin. Each time the margin is modified the associated collision shape is recreated and the margin value is used in ShapeBullet::prepare.
This commit is contained in:
parent
b01f036fb4
commit
e5bfa98d0f
9 changed files with 98 additions and 31 deletions
|
|
@ -44,19 +44,20 @@
|
|||
@author AndreaCatania
|
||||
*/
|
||||
|
||||
ShapeBullet::ShapeBullet() {}
|
||||
ShapeBullet::ShapeBullet() :
|
||||
margin(0.04) {}
|
||||
|
||||
ShapeBullet::~ShapeBullet() {}
|
||||
|
||||
btCollisionShape *ShapeBullet::create_bt_shape(const Vector3 &p_implicit_scale, real_t p_margin) {
|
||||
btCollisionShape *ShapeBullet::create_bt_shape(const Vector3 &p_implicit_scale, real_t p_extra_edge) {
|
||||
btVector3 s;
|
||||
G_TO_B(p_implicit_scale, s);
|
||||
return create_bt_shape(s, p_margin);
|
||||
return create_bt_shape(s, p_extra_edge);
|
||||
}
|
||||
|
||||
btCollisionShape *ShapeBullet::prepare(btCollisionShape *p_btShape) const {
|
||||
p_btShape->setUserPointer(const_cast<ShapeBullet *>(this));
|
||||
p_btShape->setMargin(0.);
|
||||
p_btShape->setMargin(margin);
|
||||
return p_btShape;
|
||||
}
|
||||
|
||||
|
|
@ -93,6 +94,15 @@ const Map<ShapeOwnerBullet *, int> &ShapeBullet::get_owners() const {
|
|||
return owners;
|
||||
}
|
||||
|
||||
void ShapeBullet::set_margin(real_t p_margin) {
|
||||
margin = p_margin;
|
||||
notifyShapeChanged();
|
||||
}
|
||||
|
||||
real_t ShapeBullet::get_margin() const {
|
||||
return margin;
|
||||
}
|
||||
|
||||
btEmptyShape *ShapeBullet::create_shape_empty() {
|
||||
return bulletnew(btEmptyShape);
|
||||
}
|
||||
|
|
@ -162,7 +172,7 @@ void PlaneShapeBullet::setup(const Plane &p_plane) {
|
|||
notifyShapeChanged();
|
||||
}
|
||||
|
||||
btCollisionShape *PlaneShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_margin) {
|
||||
btCollisionShape *PlaneShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge) {
|
||||
btVector3 btPlaneNormal;
|
||||
G_TO_B(plane.normal, btPlaneNormal);
|
||||
return prepare(PlaneShapeBullet::create_shape_plane(btPlaneNormal, plane.d));
|
||||
|
|
@ -190,8 +200,8 @@ void SphereShapeBullet::setup(real_t p_radius) {
|
|||
notifyShapeChanged();
|
||||
}
|
||||
|
||||
btCollisionShape *SphereShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_margin) {
|
||||
return prepare(ShapeBullet::create_shape_sphere(radius * p_implicit_scale[0] + p_margin));
|
||||
btCollisionShape *SphereShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge) {
|
||||
return prepare(ShapeBullet::create_shape_sphere(radius * p_implicit_scale[0] + p_extra_edge));
|
||||
}
|
||||
|
||||
/* Box */
|
||||
|
|
@ -217,8 +227,8 @@ void BoxShapeBullet::setup(const Vector3 &p_half_extents) {
|
|||
notifyShapeChanged();
|
||||
}
|
||||
|
||||
btCollisionShape *BoxShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_margin) {
|
||||
return prepare(ShapeBullet::create_shape_box((half_extents * p_implicit_scale) + btVector3(p_margin, p_margin, p_margin)));
|
||||
btCollisionShape *BoxShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge) {
|
||||
return prepare(ShapeBullet::create_shape_box((half_extents * p_implicit_scale) + btVector3(p_extra_edge, p_extra_edge, p_extra_edge)));
|
||||
}
|
||||
|
||||
/* Capsule */
|
||||
|
|
@ -250,8 +260,8 @@ void CapsuleShapeBullet::setup(real_t p_height, real_t p_radius) {
|
|||
notifyShapeChanged();
|
||||
}
|
||||
|
||||
btCollisionShape *CapsuleShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_margin) {
|
||||
return prepare(ShapeBullet::create_shape_capsule(radius * p_implicit_scale[0] + p_margin, height * p_implicit_scale[1] + p_margin));
|
||||
btCollisionShape *CapsuleShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge) {
|
||||
return prepare(ShapeBullet::create_shape_capsule(radius * p_implicit_scale[0] + p_extra_edge, height * p_implicit_scale[1] + p_extra_edge));
|
||||
}
|
||||
|
||||
/* Convex polygon */
|
||||
|
|
@ -292,11 +302,10 @@ void ConvexPolygonShapeBullet::setup(const Vector<Vector3> &p_vertices) {
|
|||
notifyShapeChanged();
|
||||
}
|
||||
|
||||
btCollisionShape *ConvexPolygonShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_margin) {
|
||||
btCollisionShape *ConvexPolygonShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge) {
|
||||
btCollisionShape *cs(ShapeBullet::create_shape_convex(vertices));
|
||||
cs->setLocalScaling(p_implicit_scale);
|
||||
prepare(cs);
|
||||
cs->setMargin(p_margin);
|
||||
return cs;
|
||||
}
|
||||
|
||||
|
|
@ -365,14 +374,13 @@ void ConcavePolygonShapeBullet::setup(PoolVector<Vector3> p_faces) {
|
|||
notifyShapeChanged();
|
||||
}
|
||||
|
||||
btCollisionShape *ConcavePolygonShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_margin) {
|
||||
btCollisionShape *ConcavePolygonShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge) {
|
||||
btCollisionShape *cs = ShapeBullet::create_shape_concave(meshShape);
|
||||
if (!cs)
|
||||
// This is necessary since if 0 faces the creation of concave return NULL
|
||||
cs = ShapeBullet::create_shape_empty();
|
||||
cs->setLocalScaling(p_implicit_scale);
|
||||
prepare(cs);
|
||||
cs->setMargin(p_margin);
|
||||
return cs;
|
||||
}
|
||||
|
||||
|
|
@ -458,11 +466,10 @@ void HeightMapShapeBullet::setup(PoolVector<real_t> &p_heights, int p_width, int
|
|||
notifyShapeChanged();
|
||||
}
|
||||
|
||||
btCollisionShape *HeightMapShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_margin) {
|
||||
btCollisionShape *HeightMapShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge) {
|
||||
btCollisionShape *cs(ShapeBullet::create_shape_height_field(heights, width, depth, min_height, max_height));
|
||||
cs->setLocalScaling(p_implicit_scale);
|
||||
prepare(cs);
|
||||
cs->setMargin(p_margin);
|
||||
return cs;
|
||||
}
|
||||
|
||||
|
|
@ -496,6 +503,6 @@ void RayShapeBullet::setup(real_t p_length, bool p_slips_on_slope) {
|
|||
notifyShapeChanged();
|
||||
}
|
||||
|
||||
btCollisionShape *RayShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_margin) {
|
||||
return prepare(ShapeBullet::create_shape_ray(length * p_implicit_scale[1] + p_margin, slips_on_slope));
|
||||
btCollisionShape *RayShapeBullet::create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge) {
|
||||
return prepare(ShapeBullet::create_shape_ray(length * p_implicit_scale[1] + p_extra_edge, slips_on_slope));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue