Files
2025-10-28 14:05:46 -04:00

111 lines
3.6 KiB
C++

/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */
#pragma once
#include "V8Kernel/ContactParams.h"
#include "V8Kernel/PolyConnectors.h"
#include "Util/G3DCore.h"
#include "rbx/Debug.h"
#include "BulletCollision/NarrowphaseCollision/btPersistentManifold.h"
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
#include "btBulletCollisionCommon.h"
namespace RBX {
class BulletShapeConnector : public PolyConnector,
public Allocator<BulletShapeConnector>
{
protected:
btCollisionObject* bulletCollisionObject0;
btCollisionObject* bulletCollisionObject1;
btCollisionAlgorithm* bulletAlgo;
int bulletManifoldIndex;
int bulletPointCacheIndex;
void updateConnectorPointFromManifold(bool refreshContacts = true);
void realignConnectorsToBulletContacts();
bool foundValidContactPointFromBulletManifold(btPersistentManifold* man, Vector3& p0World, Vector3& p1World);
private:
/*override*/ GeoPairType getConnectorType() const {return BULLET_SHAPE_CONNECTOR;}
bool validObjectCFrames();
virtual void updateBulletCollisionObjects();
public:
BulletShapeConnector(
Body* b0,
Body* b1,
const ContactParams& contactParams,
btCollisionObject* bulletColObj0,
btCollisionObject* bulletColObj1,
btCollisionAlgorithm* algo,
int manifoldIndex,
int cacheIndex
)
: PolyConnector(b0, b1, contactParams, 0, 0)
, bulletCollisionObject0(bulletColObj0)
, bulletCollisionObject1(bulletColObj1)
, bulletAlgo(algo)
, bulletManifoldIndex(manifoldIndex)
, bulletPointCacheIndex(cacheIndex)
{
}
~BulletShapeConnector();
/*override*/ void updateContactPoint();
void findValidContactAfterNarrowphase();
bool recalculateValidPoints(btManifoldArray& btManArray, Vector3& pt0InWorld, Vector3& pt1InWorld);
void setBulletManifoldPointIndex(int index) { bulletPointCacheIndex = index; }
int getBulletManifoldIndex(void) { return bulletManifoldIndex;}
int getBulletPointCacheIndex(void) { return bulletPointCacheIndex;}
void refreshIndividualPoint(bool swapped, Vector3 pt0InWorld, Vector3 pt1InWorld, btManifoldArray& manArray);
void updatePointWithTransform(bool swapped, btManifoldPoint& manifoldPoint);
bool isPointInvalid( btManifoldPoint& manifoldPoint, double validThreshold);
static bool match(BulletShapeConnector* oldCon, BulletShapeConnector* newCon)
{
return ((oldCon->bulletManifoldIndex == newCon->bulletManifoldIndex)
&& (oldCon->bulletPointCacheIndex == newCon->bulletPointCacheIndex)
&& (oldCon->getConnectorType() == newCon->getConnectorType()));
}
};
class BulletShapeCellConnector : public BulletShapeConnector
{
private:
/*override*/ GeoPairType getConnectorType() const {return BULLET_SHAPE_CELL_CONNECTOR;}
/*override*/ void updateBulletCollisionObjects();
public:
BulletShapeCellConnector(
Body* b0,
Body* b1,
const ContactParams& contactParams,
btCollisionObject* bulletColObj0,
btCollisionObject* bulletColObj1,
btCollisionAlgorithm* algo,
int manifoldIndex,
int cacheIndex
)
: BulletShapeConnector(b0, b1, contactParams, bulletColObj0, bulletColObj1, algo, manifoldIndex, cacheIndex)
{
}
~BulletShapeCellConnector() {}
/*override*/ void updateContactPoint();
static bool match(BulletShapeCellConnector* oldCon, BulletShapeCellConnector* newCon)
{
return ((oldCon->bulletManifoldIndex == newCon->bulletManifoldIndex)
&& (oldCon->bulletPointCacheIndex == newCon->bulletPointCacheIndex)
&& (oldCon->getConnectorType() == newCon->getConnectorType()));
}
};
} // namespace RBX