A physics collision-shape class derived from ConvexInternalShape used by the Bullet port. It caches a local axis-aligned bounding box, can recalculate that AABB from supporting vertices, transforms the cached AABB to world space, and exposes AABB and supporting-vertex methods (several are stubs or minimal implementations).
/* * C# / XNA port of Bullet (c) 2011 Mark Neale <[email protected]> * * Bullet Continuous Collision Detection and Physics Library * Copyright (c) 2003-2008 Erwin Coumans http://www.bulletphysics.com/ * * This software is provided 'as-is', without any express or implied warranty. * In no event will the authors be held liable for any damages arising from * the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ // Adapted from BulletXNA 73b2e1b9: namespace isolation, no XNA rendering, one type per file. #nullable disable #pragma warning disable CS1591, CS0168, CS0219, CS0414, CS0660, CS0661, CS0659, CS0693, CS8981, CS0108, CS0114 using System.Diagnostics; using HumanoidRetargeter.Core.Formats.Mmd.Bullet.LinearMath; namespace HumanoidRetargeter.Core.Formats.Mmd.Bullet.BulletCollision; internal class ConvexInternalAabbCachingShape : ConvexInternalShape { protected IndexedVector3 m_localAabbMin; protected IndexedVector3 m_localAabbMax; protected bool m_isLocalAabbValid; protected void SetCachedLocalAabb(ref IndexedVector3 aabbMin, ref IndexedVector3 aabbMax) { m_isLocalAabbValid = true; m_localAabbMin = aabbMin; m_localAabbMax = aabbMax; } public void GetCachedLocalAabb(out IndexedVector3 aabbMin, out IndexedVector3 aabbMax) { { } aabbMin = m_localAabbMin; aabbMax = m_localAabbMax; } public void GetNonvirtualAabb(ref IndexedMatrix trans, out IndexedVector3 aabbMin, out IndexedVector3 aabbMax, float margin) { { } AabbUtil2.TransformAabb(ref m_localAabbMin, ref m_localAabbMax, margin, ref trans, out aabbMin, out aabbMax); } public override IndexedVector3 LocalGetSupportingVertexWithoutMargin(ref IndexedVector3 vec) { return IndexedVector3.Zero; } //public: // virtual void setLocalScaling(const btVector3& scaling); // virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const; // void recalcLocalAabb(); public ConvexInternalAabbCachingShape() { m_localAabbMin = new IndexedVector3(1); m_localAabbMax = new IndexedVector3(-1); m_isLocalAabbValid = false; } public override void GetAabb(ref IndexedMatrix trans, out IndexedVector3 aabbMin, out IndexedVector3 aabbMax) { GetNonvirtualAabb(ref trans, out aabbMin, out aabbMax, GetMargin()); } public override void SetLocalScaling(ref IndexedVector3 scaling) { base.SetLocalScaling(ref scaling); RecalcLocalAabb(); } public virtual void RecalcLocalAabb() { m_isLocalAabbValid = true; //fixme - make a static list. IndexedVector4[] _supporting = new IndexedVector4[6]; BatchedUnitVectorGetSupportingVertexWithoutMargin(_directions, _supporting, 6); for (int i = 0; i < 3; ++i) { IndexedVector3 s0 = new IndexedVector3(_supporting[i]); IndexedVector3 s1 = new IndexedVector3(_supporting[i + 3]); m_localAabbMax[i] = s0[i] + m_collisionMargin; m_localAabbMin[i] = s1[i] - m_collisionMargin; } } public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(IndexedVector3[] vectors, IndexedVector4[] supportVerticesOut, int numVectors) { } public static IndexedVector3[] _directions = new IndexedVector3[] { new IndexedVector3(1.0f, 0.0f, 0.0f), new IndexedVector3(0.0f, 1.0f, 0.0f), new IndexedVector3(0.0f, 0.0f, 1.0f), new IndexedVector3(-1.0f, 0.0f, 0.0f), new IndexedVector3(0.0f, -1.0f, 0.0f), new IndexedVector3(0.0f, 0.0f, -1.0f) }; }