Adding bullet physics.
This commit is contained in:
parent
b1822b4930
commit
10a64db343
|
|
@ -9,6 +9,7 @@ panda3d_modules = {
|
|||
"direct" : "libp3direct",
|
||||
"egg" : "libpandaegg",
|
||||
"ode" : "libpandaode",
|
||||
"bullet" : "libpandabullet",
|
||||
"vision" : "libp3vision",
|
||||
"physx" : "libpandaphysx",
|
||||
"ai" : "libpandaai",
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ class panda3d(package):
|
|||
# except for skel - this is useless in a shipped game anyways.
|
||||
excludeModule('libpandaegg')
|
||||
excludeModule('libpandaode')
|
||||
excludeModule('libpandabullet')
|
||||
excludeModule('libp3vision')
|
||||
excludeModule('libpandaskel')
|
||||
excludeModule('libpandaphysx')
|
||||
|
|
@ -264,6 +265,16 @@ class ode(package):
|
|||
|
||||
file('libpandaode.dll', required = True)
|
||||
|
||||
class bullet(package):
|
||||
# This package contains the code for the Bullet integration.
|
||||
# As not every application uses the Bullet layers, and to cut down
|
||||
# the download size, it is provided as separate package.
|
||||
|
||||
config(display_name = "Panda3D Bullet integration")
|
||||
require('panda3d')
|
||||
|
||||
file('libpandabullet.dll', required = True)
|
||||
|
||||
class physx(package):
|
||||
# This package contains the code for the NVIDIA PhysX integration.
|
||||
# As not every application uses the NVIDIA PhysX layers, and to cut down
|
||||
|
|
|
|||
|
|
@ -0,0 +1,118 @@
|
|||
|
||||
class bt32BitAxisSweep3;
|
||||
class btActionInterface;
|
||||
class btAxisSweep3;
|
||||
class btBoxShape;
|
||||
class btBroadphaseInterface;
|
||||
class btBulletWorldImporter;
|
||||
class btBvhTriangleMeshShape;
|
||||
class btCapsuleShape;
|
||||
class btCapsuleShapeX;
|
||||
class btCapsuleShapeZ;
|
||||
class btCharacterControllerInterface;
|
||||
class btCollisionConfiguration;
|
||||
class btCollisionDispatcher;
|
||||
class btCollisionObject;
|
||||
class btCollisionShape;
|
||||
class btCompoundShape;
|
||||
class btConcaveShape;
|
||||
class btConeShape;
|
||||
class btConeShapeX;
|
||||
class btConeShapeZ;
|
||||
class btConeTwistConstraint;
|
||||
class btConstraintSolver;
|
||||
class btContactConstraint;
|
||||
class btContinuousDynamicsWorld;
|
||||
class btConvexShape;
|
||||
class btConvexHullShape;
|
||||
class btConvexInternalShape;
|
||||
class btConvexPointCloudShape;
|
||||
class btCylinderShape;
|
||||
class btCylinderShapeX;
|
||||
class btCylinderShapeZ;
|
||||
class btDefaultCollisionConfiguration;
|
||||
class btDefaultMotionState;
|
||||
class btDiscreteDynamicsWorld;
|
||||
class btDispatcher;
|
||||
class btDynamicsWorld;
|
||||
class btEmptyShape;
|
||||
class btGeneric6DofConstraint;
|
||||
class btGeneric6DofSpringConstraint;
|
||||
class btGhostPairCallback;
|
||||
class btGhostObject;
|
||||
class btGImpactMeshShape;
|
||||
class btHeightfieldTerrainShape;
|
||||
class btHingeConstraint;
|
||||
class btHinge2Constraint;
|
||||
class btIDebugDraw;
|
||||
class btKinematicCharacterController;
|
||||
class btManifoldPoint;
|
||||
class btMatrix3x3;
|
||||
class btMotionState;
|
||||
class btPairCachingGhostObject;
|
||||
class btParalleSequentialImpulseSolver;
|
||||
class btPersistentManifold;
|
||||
class btPlaneShape;
|
||||
class btPoint2PointConstraint;
|
||||
class btPolyhedralConvexShape;
|
||||
class btQuaternion;
|
||||
class btSequentialImpulseConstraintSolver;
|
||||
class btScalar;
|
||||
class btSliderConstraint;
|
||||
class btSoftBodyHelpers;
|
||||
class btSoftBodyRigidBodyCollisionConfiguration;
|
||||
class btSoftBodyCollisionShape;
|
||||
class btSoftBodyWorldInfo;
|
||||
class btSoftRigidDynamicsWorld;
|
||||
class btSphereShape;
|
||||
class btStaticPlaneShape;
|
||||
class btStridingMeshInterface;
|
||||
class btTransform;
|
||||
class btTriangleMesh;
|
||||
class btTypedConstraint;
|
||||
class btTypedObject;
|
||||
class btVector3;
|
||||
class btVehicleRaycaster;
|
||||
class btWheelInfo;
|
||||
|
||||
class btCollisionWorld {
|
||||
public:
|
||||
struct LocalRayResult;
|
||||
struct ClosestRayResultCallback;
|
||||
struct RayResultCallback;
|
||||
struct ContactResultCallback;
|
||||
struct AllHitsRayResultCallback;
|
||||
struct ClosestConvexResultCallback;
|
||||
};
|
||||
|
||||
class btRaycastVehicle {
|
||||
public:
|
||||
class btVehicleTuning;
|
||||
};
|
||||
|
||||
class btRigidBody {
|
||||
public:
|
||||
class btRigidBodyConstructionInfo;
|
||||
};
|
||||
|
||||
class btSoftBody {
|
||||
public:
|
||||
struct Config;
|
||||
struct Joint;
|
||||
struct Link;
|
||||
struct Material;
|
||||
struct Node;
|
||||
};
|
||||
|
||||
// BulletCollision/CollisionDispatch/btCollisionObject.h
|
||||
#define ACTIVE_TAG 1
|
||||
#define ISLAND_SLEEPING 2
|
||||
#define WANTS_DEACTIVATION 3
|
||||
#define DISABLE_DEACTIVATION 4
|
||||
#define DISABLE_SIMULATION 5
|
||||
|
||||
// BulletCollision/CollisionDispatch/btManifoldResult.h
|
||||
typedef bool (*ContactAddedCallback);
|
||||
typedef bool (*ContactProcessedCallback);
|
||||
typedef bool (*ContactDestroyedCallback);
|
||||
|
||||
|
|
@ -60,7 +60,7 @@ PkgListSet(["PYTHON", "DIRECT", # Python support
|
|||
"GL", "GLES", "GLES2"] + DXVERSIONS + ["TINYDISPLAY", "NVIDIACG", # 3D graphics
|
||||
"EGL", # OpenGL (ES) integration
|
||||
"OPENAL", "FMODEX", "FFMPEG", # Multimedia
|
||||
"ODE", "PHYSX", # Physics
|
||||
"ODE", "PHYSX", "BULLET", # Physics
|
||||
"SPEEDTREE", # SpeedTree
|
||||
"ZLIB", "PNG", "JPEG", "TIFF", "SQUISH", "FREETYPE", # 2D Formats support
|
||||
] + MAYAVERSIONS + MAXVERSIONS + [ "FCOLLADA", # 3D Formats support
|
||||
|
|
@ -506,6 +506,12 @@ if (COMPILER=="MSVC"):
|
|||
if (SDK["SPEEDTREEAPI"] == "OpenGL"):
|
||||
LibName("SPEEDTREE", "%sglew32.lib" % (libdir))
|
||||
IncDirectory("SPEEDTREE", SDK["SPEEDTREE"] + "/Include")
|
||||
if (PkgSkip("BULLET")==0):
|
||||
LibName("BULLET", GetThirdpartyDir() + "bullet/lib/LinearMath.lib")
|
||||
LibName("BULLET", GetThirdpartyDir() + "bullet/lib/BulletCollision.lib")
|
||||
LibName("BULLET", GetThirdpartyDir() + "bullet/lib/BulletDynamics.lib")
|
||||
LibName("BULLET", GetThirdpartyDir() + "bullet/lib/BulletSoftBody.lib")
|
||||
LibName("BULLET", GetThirdpartyDir() + "bullet/lib/BulletMultiThreaded.lib")
|
||||
|
||||
if (COMPILER=="LINUX"):
|
||||
PkgDisable("AWESOMIUM")
|
||||
|
|
@ -670,6 +676,9 @@ if (COMPILER=="LINUX"):
|
|||
LibName("PHYSX", "-lPhysXLoader")
|
||||
LibName("PHYSX", "-lNxCharacter")
|
||||
|
||||
#if (PkgSkip("BULLET")==0):
|
||||
# TODO
|
||||
|
||||
DefSymbol("ALWAYS", "MAKEPANDA", "")
|
||||
DefSymbol("WITHINPANDA", "WITHIN_PANDA", "1")
|
||||
IncDirectory("ALWAYS", GetOutputDir()+"/tmp")
|
||||
|
|
@ -744,8 +753,10 @@ def CompileCxx(obj,src,opts):
|
|||
cmd += "/wd4996 /wd4275 /wd4267 /wd4101 /wd4273 "
|
||||
|
||||
# Enables Windows 7 mode if SDK is detected.
|
||||
# But only if it is Windows 7 (0x601) and not e. g. Vista (0x600)
|
||||
platsdk = GetRegistryKey("SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.0", "InstallationFolder")
|
||||
if platsdk and os.path.isdir(platsdk):
|
||||
winver = sys.getwindowsversion()
|
||||
if platsdk and os.path.isdir(platsdk) and winver[0] >= 6 and winver[1] >= 1:
|
||||
cmd += "/DPANDA_WIN7 /DWINVER=0x601 "
|
||||
|
||||
cmd += "/Fo" + obj + " /nologo /c"
|
||||
|
|
@ -1472,6 +1483,7 @@ DTOOL_CONFIG=[
|
|||
("_SECURE_SCL", '1', 'UNDEF'),
|
||||
("_SECURE_SCL_THROWS", '0', 'UNDEF'),
|
||||
("HAVE_P3D_PLUGIN", 'UNDEF', 'UNDEF'),
|
||||
("HAVE_BULLET", 'UNDEF', 'UNDEF'),
|
||||
]
|
||||
|
||||
PRC_PARAMETERS=[
|
||||
|
|
@ -2057,6 +2069,10 @@ if (PkgSkip("PHYSX")==0):
|
|||
CopyAllHeaders('panda/src/physx')
|
||||
CopyAllHeaders('panda/metalibs/pandaphysx')
|
||||
|
||||
if (PkgSkip("BULLET")==0):
|
||||
CopyAllHeaders('panda/src/bullet')
|
||||
CopyAllHeaders('panda/metalibs/pandabullet')
|
||||
|
||||
if (PkgSkip("SPEEDTREE")==0):
|
||||
CopyAllHeaders('panda/src/speedtree')
|
||||
|
||||
|
|
@ -3450,6 +3466,35 @@ if (PkgSkip("ODE")==0 and not RUNTIME):
|
|||
TargetAdd('libpandaode.dll', input=COMMON_PANDA_LIBS)
|
||||
TargetAdd('libpandaode.dll', opts=['WINUSER', 'ODE'])
|
||||
|
||||
#
|
||||
# DIRECTORY: panda/src/bullet/
|
||||
#
|
||||
if (PkgSkip("BULLET")==0 and not RUNTIME):
|
||||
OPTS=['DIR:panda/src/bullet', 'BUILDING:PANDABULLET', 'BULLET']
|
||||
TargetAdd('bullet_composite.obj', opts=OPTS, input='bullet_composite.cxx')
|
||||
IGATEFILES=GetDirectoryContents('panda/src/bullet', ["*.h", "*_composite.cxx"])
|
||||
TargetAdd('libpandabullet.in', opts=OPTS, input=IGATEFILES)
|
||||
TargetAdd('libpandabullet.in', opts=['IMOD:pandabullet', 'ILIB:libpandabullet', 'SRCDIR:panda/src/bullet'])
|
||||
TargetAdd('libpandabullet_igate.obj', input='libpandabullet.in', opts=["DEPENDENCYONLY"])
|
||||
|
||||
#
|
||||
# DIRECTORY: panda/metalibs/pandabullet/
|
||||
#
|
||||
if (PkgSkip("BULLET")==0 and not RUNTIME):
|
||||
OPTS=['DIR:panda/metalibs/pandabullet', 'BUILDING:PANDABULLET', 'BULLET']
|
||||
TargetAdd('pandabullet_pandabullet.obj', opts=OPTS, input='pandabullet.cxx')
|
||||
|
||||
TargetAdd('libpandabullet_module.obj', input='libpandabullet.in')
|
||||
TargetAdd('libpandabullet_module.obj', opts=OPTS)
|
||||
TargetAdd('libpandabullet_module.obj', opts=['IMOD:pandabullet', 'ILIB:libpandabullet'])
|
||||
|
||||
TargetAdd('libpandabullet.dll', input='pandabullet_pandabullet.obj')
|
||||
TargetAdd('libpandabullet.dll', input='libpandabullet_module.obj')
|
||||
TargetAdd('libpandabullet.dll', input='bullet_composite.obj')
|
||||
TargetAdd('libpandabullet.dll', input='libpandabullet_igate.obj')
|
||||
TargetAdd('libpandabullet.dll', input=COMMON_PANDA_LIBS)
|
||||
TargetAdd('libpandabullet.dll', opts=['WINUSER', 'BULLET'])
|
||||
|
||||
#
|
||||
# DIRECTORY: panda/src/physx/
|
||||
#
|
||||
|
|
@ -4869,6 +4914,8 @@ if (PkgSkip("PYTHON")==0 and not RUNTIME):
|
|||
TargetAdd('PandaModules.py', input='libp3awesomium.dll')
|
||||
if (PkgSkip("ODE")==0):
|
||||
TargetAdd('PandaModules.py', input='libpandaode.dll')
|
||||
if (PkgSkip("BULLET")==0):
|
||||
TargetAdd('PandaModules.py', input='libpandabullet.dll')
|
||||
|
||||
#
|
||||
# Generate the models directory and samples directory
|
||||
|
|
|
|||
|
|
@ -0,0 +1,20 @@
|
|||
// DIR_TYPE "metalib" indicates we are building a shared library that
|
||||
// consists mostly of references to other shared libraries. Under
|
||||
// Windows, this directly produces a DLL (as opposed to the regular
|
||||
// src libraries, which don't produce anything but a pile of OBJ files
|
||||
// under Windows).
|
||||
|
||||
#define DIR_TYPE metalib
|
||||
#define BUILD_DIRECTORY $[HAVE_BULLET]
|
||||
#define BUILDING_DLL BUILDING_PANDABULLET
|
||||
|
||||
#define COMPONENT_LIBS bullet
|
||||
#define LOCAL_LIBS linmath putil express
|
||||
#define OTHER_LIBS interrogatedb:c dconfig:c dtoolconfig:m \
|
||||
dtoolutil:c dtoolbase:c dtool:m prc:c
|
||||
|
||||
#begin metalib_target
|
||||
#define TARGET pandabullet
|
||||
#define SOURCES pandabullet.cxx pandabullet.h
|
||||
#define INSTALL_HEADERS pandabullet.h
|
||||
#end metalib_target
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
// Filename: pandabullet.cxx
|
||||
// Created by: enn0x (10May2011)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "pandabullet.h"
|
||||
#include "config_bullet.h"
|
||||
|
||||
// By including checkPandaVersion.h, we guarantee that runtime
|
||||
// attempts to load libpandabullet.so/.dll will fail if they
|
||||
// inadvertently link with the wrong version of libdtool.so/.dll.
|
||||
|
||||
#include "checkPandaVersion.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: init_libpandabullet
|
||||
// Description: Initializes the library. This must be called at
|
||||
// least once before any of the functions or classes in
|
||||
// this library can be used. Normally it will be
|
||||
// called by the static initializers and need not be
|
||||
// called explicitly, but special cases exist.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void
|
||||
init_libpandabullet() {
|
||||
init_libbullet();
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
// Filename: pandabullet.h
|
||||
// Created by: enn0x (10May2011)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef PANDABULLET_H
|
||||
#define PANDABULLET_H
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
EXPCL_PANDABULLET void init_libpandabullet();
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,222 @@
|
|||
#define BUILD_DIRECTORY $[HAVE_BULLET]
|
||||
#define BUILDING_DLL BUILDING_PANDABULLET
|
||||
|
||||
#define OTHER_LIBS interrogatedb:c dconfig:c dtoolconfig:m dtoolutil:c dtoolbase:c dtool:m prc:c
|
||||
|
||||
#begin lib_target
|
||||
#define TARGET bullet
|
||||
#define LOCAL_LIBS pgraph linmath grutil
|
||||
#define USE_PACKAGES bullet
|
||||
#define COMBINED_SOURCES $[TARGET]_composite.cxx
|
||||
|
||||
#define SOURCES \
|
||||
bulletAllHitsRayResult.I \
|
||||
bulletAllHitsRayResult.h \
|
||||
bulletBodyNode.I \
|
||||
bulletBodyNode.h \
|
||||
bulletBoxShape.I \
|
||||
bulletBoxShape.h \
|
||||
bulletCapsuleShape.I \
|
||||
bulletCapsuleShape.h \
|
||||
bulletCharacterControllerNode.I \
|
||||
bulletCharacterControllerNode.h \
|
||||
bulletClosestHitRayResult.I \
|
||||
bulletClosestHitRayResult.h \
|
||||
bulletClosestHitSweepResult.I \
|
||||
bulletClosestHitSweepResult.h \
|
||||
bulletConeShape.I \
|
||||
bulletConeShape.h \
|
||||
bulletConeTwistConstraint.I \
|
||||
bulletConeTwistConstraint.h \
|
||||
bulletConstraint.I \
|
||||
bulletConstraint.h \
|
||||
bulletContactCallbacks.h \
|
||||
bulletContactResult.I \
|
||||
bulletContactResult.h \
|
||||
bulletConvexHullShape.I \
|
||||
bulletConvexHullShape.h \
|
||||
bulletConvexPointCloudShape.I \
|
||||
bulletConvexPointCloudShape.h \
|
||||
bulletCylinderShape.I \
|
||||
bulletCylinderShape.h \
|
||||
bulletDebugNode.I \
|
||||
bulletDebugNode.h \
|
||||
bulletDistanceConstraint.I \
|
||||
bulletDistanceConstraint.h \
|
||||
bulletGenericConstraint.I \
|
||||
bulletGenericConstraint.h \
|
||||
bulletGhostNode.I \
|
||||
bulletGhostNode.h \
|
||||
bulletHeightfieldShape.I \
|
||||
bulletHeightfieldShape.h \
|
||||
bulletHelper.I \
|
||||
bulletHelper.h \
|
||||
bulletHingeConstraint.I \
|
||||
bulletHingeConstraint.h \
|
||||
bulletManifoldPoint.I \
|
||||
bulletManifoldPoint.h \
|
||||
bulletPersistentManifold.I \
|
||||
bulletPersistentManifold.h \
|
||||
bulletPlaneShape.I \
|
||||
bulletPlaneShape.h \
|
||||
bulletRigidBodyNode.I \
|
||||
bulletRigidBodyNode.h \
|
||||
bulletShape.I \
|
||||
bulletShape.h \
|
||||
bulletSliderConstraint.I \
|
||||
bulletSliderConstraint.h \
|
||||
bulletSoftBodyConfig.I \
|
||||
bulletSoftBodyConfig.h \
|
||||
bulletSoftBodyMaterial.I \
|
||||
bulletSoftBodyMaterial.h \
|
||||
bulletSoftBodyNode.I \
|
||||
bulletSoftBodyNode.h \
|
||||
bulletSoftBodyShape.I \
|
||||
bulletSoftBodyShape.h \
|
||||
bulletSoftBodyWorldInfo.I \
|
||||
bulletSoftBodyWorldInfo.h \
|
||||
bulletSphereShape.I \
|
||||
bulletSphereShape.h \
|
||||
bulletTriangleMesh.I \
|
||||
bulletTriangleMesh.h \
|
||||
bulletTriangleMeshShape.I \
|
||||
bulletTriangleMeshShape.h \
|
||||
bulletVehicle.I \
|
||||
bulletVehicle.h \
|
||||
bulletWheel.I \
|
||||
bulletWheel.h \
|
||||
bulletWorld.I \
|
||||
bulletWorld.h \
|
||||
bullet_includes.h \
|
||||
bullet_utils.I \
|
||||
bullet_utils.h \
|
||||
config_bullet.h \
|
||||
|
||||
#define INCLUDED_SOURCES \
|
||||
bulletAllHitsRayResult.cxx \
|
||||
bulletBodyNode.cxx \
|
||||
bulletBoxShape.cxx \
|
||||
bulletCapsuleShape.cxx \
|
||||
bulletCharacterControllerNode.cxx \
|
||||
bulletClosestHitRayResult.cxx \
|
||||
bulletClosestHitSweepResult.cxx \
|
||||
bulletConeShape.cxx \
|
||||
bulletConeTwistConstraint.cxx \
|
||||
bulletConstraint.cxx \
|
||||
bulletContactResult.cxx \
|
||||
bulletConvexHullShape.cxx \
|
||||
bulletConvexPointCloudShape.cxx \
|
||||
bulletCylinderShape.cxx \
|
||||
bulletDebugNode.cxx \
|
||||
bulletDistanceConstraint.cxx \
|
||||
bulletGenericConstraint.cxx \
|
||||
bulletGhostNode.cxx \
|
||||
bulletHeightfieldShape.cxx \
|
||||
bulletHelper.cxx \
|
||||
bulletHingeConstraint.cxx \
|
||||
bulletManifoldPoint.cxx \
|
||||
bulletPersistentManifold.cxx \
|
||||
bulletPlaneShape.cxx \
|
||||
bulletRigidBodyNode.cxx \
|
||||
bulletShape.cxx \
|
||||
bulletSliderConstraint.cxx \
|
||||
bulletSoftBodyConfig.cxx \
|
||||
bulletSoftBodyMaterial.cxx \
|
||||
bulletSoftBodyNode.cxx \
|
||||
bulletSoftBodyShape.cxx \
|
||||
bulletSoftBodyWorldInfo.cxx \
|
||||
bulletSphereShape.cxx \
|
||||
bulletTriangleMesh.cxx \
|
||||
bulletTriangleMeshShape.cxx \
|
||||
bulletVehicle.cxx \
|
||||
bulletWheel.cxx \
|
||||
bulletWorld.cxx \
|
||||
bullet_composite.cxx \
|
||||
bullet_utils.cxx \
|
||||
config_bullet.cxx \
|
||||
|
||||
#define INSTALL_HEADERS \
|
||||
bulletAllHitsRayResult.I \
|
||||
bulletAllHitsRayResult.h \
|
||||
bulletBodyNode.I \
|
||||
bulletBodyNode.h \
|
||||
bulletBoxShape.I \
|
||||
bulletBoxShape.h \
|
||||
bulletCapsuleShape.I \
|
||||
bulletCapsuleShape.h \
|
||||
bulletCharacterControllerNode.I \
|
||||
bulletCharacterControllerNode.h \
|
||||
bulletClosestHitRayResult.I \
|
||||
bulletClosestHitRayResult.h \
|
||||
bulletClosestHitSweepResult.I \
|
||||
bulletClosestHitSweepResult.h \
|
||||
bulletConeShape.I \
|
||||
bulletConeShape.h \
|
||||
bulletConeTwistConstraint.I \
|
||||
bulletConeTwistConstraint.h \
|
||||
bulletConstraint.I \
|
||||
bulletConstraint.h \
|
||||
bulletContactCallbacks.h \
|
||||
bulletContactResult.I \
|
||||
bulletContactResult.h \
|
||||
bulletConvexHullShape.I \
|
||||
bulletConvexHullShape.h \
|
||||
bulletConvexPointCloudShape.I \
|
||||
bulletConvexPointCloudShape.h \
|
||||
bulletCylinderShape.I \
|
||||
bulletCylinderShape.h \
|
||||
bulletDebugNode.I \
|
||||
bulletDebugNode.h \
|
||||
bulletDistanceConstraint.I \
|
||||
bulletDistanceConstraint.h \
|
||||
bulletGenericConstraint.I \
|
||||
bulletGenericConstraint.h \
|
||||
bulletGhostNode.I \
|
||||
bulletGhostNode.h \
|
||||
bulletHeightfieldShape.I \
|
||||
bulletHeightfieldShape.h \
|
||||
bulletHelper.I \
|
||||
bulletHelper.h \
|
||||
bulletHingeConstraint.I \
|
||||
bulletHingeConstraint.h \
|
||||
bulletManifoldPoint.I \
|
||||
bulletManifoldPoint.h \
|
||||
bulletPersistentManifold.I \
|
||||
bulletPersistentManifold.h \
|
||||
bulletPlaneShape.I \
|
||||
bulletPlaneShape.h \
|
||||
bulletRigidBodyNode.I \
|
||||
bulletRigidBodyNode.h \
|
||||
bulletShape.I \
|
||||
bulletShape.h \
|
||||
bulletSliderConstraint.I \
|
||||
bulletSliderConstraint.h \
|
||||
bulletSoftBodyConfig.I \
|
||||
bulletSoftBodyConfig.h \
|
||||
bulletSoftBodyMaterial.I \
|
||||
bulletSoftBodyMaterial.h \
|
||||
bulletSoftBodyNode.I \
|
||||
bulletSoftBodyNode.h \
|
||||
bulletSoftBodyShape.I \
|
||||
bulletSoftBodyShape.h \
|
||||
bulletSoftBodyWorldInfo.I \
|
||||
bulletSoftBodyWorldInfo.h \
|
||||
bulletSphereShape.I \
|
||||
bulletSphereShape.h \
|
||||
bulletTriangleMesh.I \
|
||||
bulletTriangleMesh.h \
|
||||
bulletTriangleMeshShape.I \
|
||||
bulletTriangleMeshShape.h \
|
||||
bulletVehicle.I \
|
||||
bulletVehicle.h \
|
||||
bulletWheel.I \
|
||||
bulletWheel.h \
|
||||
bulletWorld.I \
|
||||
bulletWorld.h \
|
||||
bullet_includes.h \
|
||||
bullet_utils.I \
|
||||
bullet_utils.h \
|
||||
|
||||
#define IGATESCAN all
|
||||
|
||||
#end lib_target
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
// Filename: bulletAllHitsRayResult.I
|
||||
// Created by: enn0x (21Feb10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletAllHitsRayResult::empty
|
||||
// Access: Published
|
||||
// Description: Named constructor intended to be used for asserts
|
||||
// with have to return a concrete value.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletAllHitsRayResult BulletAllHitsRayResult::
|
||||
empty() {
|
||||
|
||||
btVector3 from;
|
||||
btVector3 to;
|
||||
|
||||
return BulletAllHitsRayResult(from, to, CollideMask::all_on());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRayHit::empty
|
||||
// Access: Published
|
||||
// Description: Named constructor intended to be used for asserts
|
||||
// with have to return a concrete value.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletRayHit BulletRayHit::
|
||||
empty() {
|
||||
|
||||
return BulletRayHit();
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,166 @@
|
|||
// Filename: bulletAllHitsRayResult.cxx
|
||||
// Created by: enn0x (21Feb10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletAllHitsRayResult.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletAllHitsRayResult::Constructor
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletAllHitsRayResult::
|
||||
BulletAllHitsRayResult(const btVector3 &from_pos, const btVector3 &to_pos, const CollideMask &mask)
|
||||
: btCollisionWorld::AllHitsRayResultCallback(from_pos, to_pos), _mask(mask) {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletAllHitsRayResult::needsCollision
|
||||
// Access: Protected
|
||||
// Description: Override default implementation.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletAllHitsRayResult::
|
||||
needsCollision(btBroadphaseProxy* proxy0) const {
|
||||
|
||||
// Original implementation:
|
||||
//bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
|
||||
//collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
|
||||
//return collides;
|
||||
|
||||
btCollisionObject *obj0 = (btCollisionObject *) proxy0->m_clientObject;
|
||||
PandaNode *node0 = (PandaNode *) obj0->getUserPointer();
|
||||
CollideMask mask0 = node0->get_into_collide_mask();
|
||||
|
||||
return (_mask & mask0) != 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletAllHitsRayResult::get_from_pos
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletAllHitsRayResult::
|
||||
get_from_pos() const {
|
||||
|
||||
return btVector3_to_LPoint3f(m_rayFromWorld);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletAllHitsRayResult::get_to_pos
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletAllHitsRayResult::
|
||||
get_to_pos() const {
|
||||
|
||||
return btVector3_to_LPoint3f(m_rayToWorld);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletAllHitsRayResult::has_hits
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletAllHitsRayResult::
|
||||
has_hits() const {
|
||||
|
||||
return hasHit();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletAllHitsRayResult::get_closest_hit_fraction
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletAllHitsRayResult::
|
||||
get_closest_hit_fraction() const {
|
||||
|
||||
return m_closestHitFraction;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletAllHitsRayResult::get_num_hits
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
int BulletAllHitsRayResult::
|
||||
get_num_hits() const {
|
||||
|
||||
return m_collisionObjects.size();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletAllHitsRayResult::get_hit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
const BulletRayHit BulletAllHitsRayResult::
|
||||
get_hit(int idx) const {
|
||||
|
||||
nassertr(idx >= 0 && idx < get_num_hits(), BulletRayHit::empty());
|
||||
|
||||
BulletRayHit hit;
|
||||
|
||||
hit._object = m_collisionObjects[idx];
|
||||
hit._normal = m_hitNormalWorld[idx];
|
||||
hit._pos = m_hitPointWorld[idx];
|
||||
hit._fraction = m_hitFractions[idx];
|
||||
|
||||
return hit;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRayHit::get_hit_fraction
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletRayHit::
|
||||
get_hit_fraction() const {
|
||||
|
||||
return _fraction;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRayHit::get_node
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
PandaNode *BulletRayHit::
|
||||
get_node() const {
|
||||
|
||||
return (_object) ? (PandaNode *)_object->getUserPointer() : NULL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRayHit::get_hit_pos
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletRayHit::
|
||||
get_hit_pos() const {
|
||||
|
||||
return btVector3_to_LPoint3f(_pos);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRayHit::get_hit_normal
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LVector3f BulletRayHit::
|
||||
get_hit_normal() const {
|
||||
|
||||
return btVector3_to_LVector3f(_normal);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
// Filename: bulletAllHitsRayResult.h
|
||||
// Created by: enn0x (21Feb10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_ALL_HITS_RAY_RESULT_H__
|
||||
#define __BULLET_ALL_HITS_RAY_RESULT_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
|
||||
#include "luse.h"
|
||||
#include "pandaNode.h"
|
||||
#include "collideMask.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletRayHit
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
struct BulletRayHit {
|
||||
|
||||
PUBLISHED:
|
||||
INLINE static BulletRayHit empty();
|
||||
|
||||
PandaNode *get_node() const;
|
||||
LPoint3f get_hit_pos() const;
|
||||
LVector3f get_hit_normal() const;
|
||||
float get_hit_fraction() const;
|
||||
|
||||
private:
|
||||
btCollisionObject *_object;
|
||||
btVector3 _normal;
|
||||
btVector3 _pos;
|
||||
btScalar _fraction;
|
||||
|
||||
friend struct BulletAllHitsRayResult;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletAllHitsRayResult
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
struct EXPCL_PANDABULLET BulletAllHitsRayResult : public btCollisionWorld::AllHitsRayResultCallback {
|
||||
|
||||
PUBLISHED:
|
||||
INLINE static BulletAllHitsRayResult empty();
|
||||
|
||||
LPoint3f get_from_pos() const;
|
||||
LPoint3f get_to_pos() const;
|
||||
|
||||
bool has_hits() const;
|
||||
float get_closest_hit_fraction() const;
|
||||
|
||||
int get_num_hits() const;
|
||||
const BulletRayHit get_hit(int idx) const;
|
||||
MAKE_SEQ(get_hits, get_num_hits, get_hit);
|
||||
|
||||
public:
|
||||
virtual bool needsCollision(btBroadphaseProxy* proxy0) const;
|
||||
|
||||
private:
|
||||
BulletAllHitsRayResult(const btVector3 &from_pos, const btVector3 &to_pos, const CollideMask &mask);
|
||||
|
||||
CollideMask _mask;
|
||||
|
||||
friend class BulletWorld;
|
||||
};
|
||||
|
||||
#include "bulletAllHitsRayResult.I"
|
||||
|
||||
#endif // __BULLET_ALL_HITS_RAY_RESULT_H__
|
||||
|
|
@ -0,0 +1,205 @@
|
|||
// Filename: bulletBodyNode.I
|
||||
// Created by: enn0x (19Nov10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletBodyNode::
|
||||
~BulletBodyNode() {
|
||||
|
||||
if (_shape && (
|
||||
_shape->getShapeType() == COMPOUND_SHAPE_PROXYTYPE ||
|
||||
_shape->getShapeType() == EMPTY_SHAPE_PROXYTYPE)) {
|
||||
delete _shape;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::notify_collisions
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletBodyNode::
|
||||
notify_collisions(bool value) {
|
||||
|
||||
set_collision_flag(btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK, value);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::notifies_collisions
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool BulletBodyNode::
|
||||
notifies_collisions() const {
|
||||
|
||||
return get_collision_flag(btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::set_collision_flag
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletBodyNode::
|
||||
set_collision_flag(int flag, bool value) {
|
||||
|
||||
int flags = get_object()->getCollisionFlags();
|
||||
|
||||
if (value == true) {
|
||||
flags |= flag;
|
||||
}
|
||||
else {
|
||||
flags &= ~(flag);
|
||||
}
|
||||
|
||||
get_object()->setCollisionFlags(flags);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_collision_flag
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool BulletBodyNode::
|
||||
get_collision_flag(int flag) const {
|
||||
|
||||
return (get_object()->getCollisionFlags() & flag) ? true : false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::is_static
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool BulletBodyNode::
|
||||
is_static() const {
|
||||
|
||||
return get_object()->isStaticObject();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::is_kinematic
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool BulletBodyNode::
|
||||
is_kinematic() const {
|
||||
|
||||
return get_object()->isKinematicObject();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::set_static
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletBodyNode::
|
||||
set_static(bool value) {
|
||||
|
||||
set_collision_flag(btCollisionObject::CF_STATIC_OBJECT, value);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::set_kinematic
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletBodyNode::
|
||||
set_kinematic(bool value) {
|
||||
|
||||
set_collision_flag(btCollisionObject::CF_KINEMATIC_OBJECT, value);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_restitution
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletBodyNode::
|
||||
get_restitution() const {
|
||||
|
||||
return get_object()->getRestitution();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::set_restitution
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletBodyNode::
|
||||
set_restitution(float restitution) {
|
||||
|
||||
return get_object()->setRestitution(restitution);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_friction
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletBodyNode::
|
||||
get_friction() const {
|
||||
|
||||
return get_object()->getFriction();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::set_friction
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletBodyNode::
|
||||
set_friction(float friction) {
|
||||
|
||||
return get_object()->setFriction(friction);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::has_anisotropic_friction
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool BulletBodyNode::
|
||||
has_anisotropic_friction() const {
|
||||
|
||||
return get_object()->hasAnisotropicFriction();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_num_shapes
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE int BulletBodyNode::
|
||||
get_num_shapes() const {
|
||||
|
||||
return _shapes.size();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_shape
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletShape *BulletBodyNode::
|
||||
get_shape(int idx) const {
|
||||
|
||||
nassertr(idx >= 0 && idx < (int)_shapes.size(), NULL);
|
||||
return _shapes[idx];
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,640 @@
|
|||
// Filename: bulletBodyNode.cxx
|
||||
// Created by: enn0x (19Nov10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletBodyNode.h"
|
||||
#include "bulletShape.h"
|
||||
#include "bulletWorld.h"
|
||||
#include "bulletTriangleMesh.h"
|
||||
|
||||
#include "collisionBox.h"
|
||||
#include "collisionPlane.h"
|
||||
#include "collisionSphere.h"
|
||||
#include "collisionPolygon.h"
|
||||
|
||||
TypeHandle BulletBodyNode::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletBodyNode::
|
||||
BulletBodyNode(const char *name) : PandaNode(name) {
|
||||
|
||||
// Shape
|
||||
_shape = new btEmptyShape();
|
||||
|
||||
// Transform changed callback
|
||||
_disable_transform_changed = false;
|
||||
|
||||
// Default collide mask
|
||||
set_into_collide_mask(CollideMask::all_on());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_legal_collide_mask
|
||||
// Access: Public, virtual
|
||||
// Description: Returns the subset of CollideMask bits that may be
|
||||
// set for this particular type of PandaNode. For
|
||||
// BodyNodes this returns all bits on.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
CollideMask BulletBodyNode::
|
||||
get_legal_collide_mask() const {
|
||||
|
||||
return CollideMask::all_on();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::safe_to_flatten
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is generally safe to flatten out
|
||||
// this particular kind of Node by duplicating
|
||||
// instances, false otherwise (for instance, a Camera
|
||||
// cannot be safely flattened, because the Camera
|
||||
// pointer itself is meaningful).
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletBodyNode::
|
||||
safe_to_flatten() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::safe_to_transform
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is generally safe to transform
|
||||
// this particular kind of Node by calling the xform()
|
||||
// method, false otherwise. For instance, it's usually
|
||||
// a bad idea to attempt to xform a Character.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletBodyNode::
|
||||
safe_to_transform() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::safe_to_modify_transform
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is safe to automatically adjust
|
||||
// the transform on this kind of node. Usually, this is
|
||||
// only a bad idea if the user expects to find a
|
||||
// particular transform on the node.
|
||||
//
|
||||
// ModelNodes with the preserve_transform flag set are
|
||||
// presently the only kinds of nodes that should not
|
||||
// have their transform even adjusted.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletBodyNode::
|
||||
safe_to_modify_transform() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::safe_to_combine
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is generally safe to combine this
|
||||
// particular kind of PandaNode with other kinds of
|
||||
// PandaNodes of compatible type, adding children or
|
||||
// whatever. For instance, an LODNode should not be
|
||||
// combined with any other PandaNode, because its set of
|
||||
// children is meaningful.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletBodyNode::
|
||||
safe_to_combine() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::safe_to_combine_children
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is generally safe to combine the
|
||||
// children of this PandaNode with each other. For
|
||||
// instance, an LODNode's children should not be
|
||||
// combined with each other, because the set of children
|
||||
// is meaningful.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletBodyNode::
|
||||
safe_to_combine_children() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::safe_to_flatten_below
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if a flatten operation may safely
|
||||
// continue past this node, or false if nodes below this
|
||||
// node may not be molested.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletBodyNode::
|
||||
safe_to_flatten_below() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::transform_changed
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletBodyNode::
|
||||
transform_changed() {
|
||||
|
||||
// Apply scale to collision shape
|
||||
CPT(TransformState) xform = this->get_transform();
|
||||
if (xform->has_scale()) {
|
||||
LVecBase3f scale = xform->get_scale();
|
||||
_shape->setLocalScaling(LVecBase3f_to_btVector3(scale));
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::add_shape
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletBodyNode::
|
||||
add_shape(BulletShape *shape, CPT(TransformState) xform) {
|
||||
|
||||
nassertv(get_object());
|
||||
|
||||
// Transform
|
||||
btTransform trans;
|
||||
if (xform) {
|
||||
trans = LMatrix4f_to_btTrans(xform->get_mat());
|
||||
}
|
||||
else {
|
||||
trans.setIdentity();
|
||||
}
|
||||
|
||||
// Root shape
|
||||
btCollisionShape *previous = get_object()->getCollisionShape();
|
||||
btCollisionShape *next;
|
||||
|
||||
if (_shapes.size() == 0) {
|
||||
nassertv(previous->getShapeType() == EMPTY_SHAPE_PROXYTYPE);
|
||||
|
||||
if (xform) {
|
||||
// One shape, with transform
|
||||
next = new btCompoundShape();
|
||||
((btCompoundShape *)next)->addChildShape(trans, shape->ptr());
|
||||
}
|
||||
else {
|
||||
// One shape, w/o transform
|
||||
next = shape->ptr();
|
||||
}
|
||||
|
||||
get_object()->setCollisionShape(next);
|
||||
_shape = next;
|
||||
|
||||
delete previous;
|
||||
}
|
||||
else if (_shapes.size() == 1) {
|
||||
// Two shapes. Previous shape might already be a compound.
|
||||
if (previous->getShapeType() == COMPOUND_SHAPE_PROXYTYPE) {
|
||||
next = previous;
|
||||
}
|
||||
else {
|
||||
next = new btCompoundShape();
|
||||
|
||||
btTransform previous_trans = btTransform::getIdentity();
|
||||
((btCompoundShape *)next)->addChildShape(previous_trans, previous);
|
||||
}
|
||||
|
||||
((btCompoundShape *)next)->addChildShape(trans, shape->ptr());
|
||||
|
||||
get_object()->setCollisionShape(next);
|
||||
_shape = next;
|
||||
}
|
||||
else {
|
||||
// Three or more shapes. Previous shape is always a compound
|
||||
nassertv(previous->getShapeType() == COMPOUND_SHAPE_PROXYTYPE);
|
||||
|
||||
((btCompoundShape *)previous)->addChildShape(trans, shape->ptr());
|
||||
}
|
||||
|
||||
_shapes.push_back(shape);
|
||||
|
||||
shape_changed();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::remove_shape
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletBodyNode::
|
||||
remove_shape(BulletShape *shape) {
|
||||
|
||||
nassertv(get_object());
|
||||
|
||||
BulletShapes::iterator found;
|
||||
PT(BulletShape) ptshape = shape;
|
||||
found = find(_shapes.begin(), _shapes.end(), ptshape);
|
||||
|
||||
if (found == _shapes.end()) {
|
||||
bullet_cat.warning() << "shape not attached" << endl;
|
||||
}
|
||||
else {
|
||||
_shapes.erase(found);
|
||||
|
||||
// Determine the new root shape
|
||||
btCollisionShape *previous = get_object()->getCollisionShape();
|
||||
btCollisionShape *next;
|
||||
|
||||
if (_shapes.size() == 0) {
|
||||
// No more shapes remaining
|
||||
next = new btEmptyShape();
|
||||
|
||||
get_object()->setCollisionShape(next);
|
||||
_shape = next;
|
||||
|
||||
// The previous shape might be a compound. Then delete it.
|
||||
if (previous->getShapeType() == COMPOUND_SHAPE_PROXYTYPE) {
|
||||
delete previous;
|
||||
}
|
||||
}
|
||||
else if (_shapes.size() == 1) {
|
||||
// Only one shape remaining
|
||||
nassertv(previous->getShapeType() == COMPOUND_SHAPE_PROXYTYPE)
|
||||
|
||||
btCompoundShape *compound = (btCompoundShape *)previous;
|
||||
compound->removeChildShape(shape->ptr());
|
||||
|
||||
nassertv(compound->getNumChildShapes() == 1);
|
||||
|
||||
// The compound is no longer required if the remaining shape
|
||||
// has no transform
|
||||
btTransform trans = compound->getChildTransform(0);
|
||||
if (is_identity(trans)) {
|
||||
next = compound->getChildShape(0);
|
||||
|
||||
get_object()->setCollisionShape(next);
|
||||
_shape = next;
|
||||
|
||||
delete compound;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// More than one shape are remaining
|
||||
nassertv(previous->getShapeType() == COMPOUND_SHAPE_PROXYTYPE)
|
||||
|
||||
btCompoundShape *compound = (btCompoundShape *)previous;
|
||||
compound->removeChildShape(shape->ptr());
|
||||
}
|
||||
|
||||
shape_changed();
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::is_identity
|
||||
// Access: Private
|
||||
// Description: Returns TRUE if the transform is an identity
|
||||
// transform, otherwise FALSE.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletBodyNode::
|
||||
is_identity(btTransform &trans) {
|
||||
|
||||
btVector3 null(0, 0, 0);
|
||||
|
||||
return (trans.getOrigin() == null
|
||||
&& trans.getRotation().getAxis() == null);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_shape_pos
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletBodyNode::
|
||||
get_shape_pos(int idx) const {
|
||||
|
||||
nassertr(idx >= 0 && idx < (int)_shapes.size(), LPoint3f::zero());
|
||||
return get_shape_mat(idx).get_row3(3);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_shape_mat
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LMatrix4f BulletBodyNode::
|
||||
get_shape_mat(int idx) const {
|
||||
|
||||
nassertr(idx >= 0 && idx < (int)_shapes.size(), LMatrix4f::ident_mat());
|
||||
|
||||
btCollisionShape *root = get_object()->getCollisionShape();
|
||||
if (root->getShapeType() == COMPOUND_SHAPE_PROXYTYPE) {
|
||||
btCompoundShape *compound = (btCompoundShape *)root;
|
||||
|
||||
btTransform xform = compound->getChildTransform(idx);
|
||||
return btTrans_to_LMatrix4f(xform);
|
||||
|
||||
// The above code assumes that shape's index in _shapes member
|
||||
// is the same as the shapes index within the compound. If it
|
||||
// turns out that this is not always true we could use the
|
||||
// following code:
|
||||
/*
|
||||
btCollisionShape *shape = get_shape(idx)->ptr();
|
||||
for (int i=0; i<compound->getNumChildShapes(); i++) {
|
||||
if (compound->getChildShape(i) == shape) {
|
||||
btTransform xform = compound->getChildTransform(idx);
|
||||
return btTrans_to_LMatrix4f(xform);
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
return LMatrix4f::ident_mat();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::shape_changed
|
||||
// Access: Published
|
||||
// Description: Hook which will be called whenever the total shape
|
||||
// of a body changed. Used for example to update
|
||||
// the mass properties (inertia) of a rigid body.
|
||||
// The default implementation does nothing.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletBodyNode::
|
||||
shape_changed() {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::set_deactivation_time
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletBodyNode::
|
||||
set_deactivation_time(float dt) {
|
||||
|
||||
get_object()->setDeactivationTime(dt);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_deactivation_time
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletBodyNode::
|
||||
get_deactivation_time() const {
|
||||
|
||||
return get_object()->getDeactivationTime();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::is_active
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletBodyNode::
|
||||
is_active() const {
|
||||
|
||||
return get_object()->isActive();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::set_active
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletBodyNode::
|
||||
set_active(bool active, bool force) {
|
||||
|
||||
if (active) {
|
||||
get_object()->activate(force);
|
||||
}
|
||||
else {
|
||||
if (force) {
|
||||
get_object()->forceActivationState(ISLAND_SLEEPING);
|
||||
}
|
||||
else {
|
||||
get_object()->setActivationState(ISLAND_SLEEPING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::set_disable_deactivation
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletBodyNode::
|
||||
set_disable_deactivation(bool disable, bool force) {
|
||||
|
||||
int state = (disable) ? DISABLE_DEACTIVATION : WANTS_DEACTIVATION;
|
||||
|
||||
if (force) {
|
||||
get_object()->forceActivationState(state);
|
||||
}
|
||||
else {
|
||||
get_object()->setActivationState(state);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_disable_deactivation
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletBodyNode::
|
||||
get_disable_deactivation() const {
|
||||
|
||||
return (get_object()->getActivationState() & DISABLE_DEACTIVATION) != 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::check_collision_with
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletBodyNode::
|
||||
check_collision_with(PandaNode *node) {
|
||||
|
||||
btCollisionObject *obj = BulletWorld::get_collision_object(node);
|
||||
|
||||
if (obj) {
|
||||
return get_object()->checkCollideWith(obj);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_anisotropic_friction
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LVecBase3f BulletBodyNode::
|
||||
get_anisotropic_friction() const {
|
||||
|
||||
return btVector3_to_LVecBase3f(get_object()->getAnisotropicFriction());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::set_anisotropic_friction
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletBodyNode::
|
||||
set_anisotropic_friction(const LVecBase3f &friction) {
|
||||
|
||||
nassertv(!friction.is_nan());
|
||||
get_object()->setAnisotropicFriction(LVecBase3f_to_btVector3(friction));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::has_contact_response
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletBodyNode::
|
||||
has_contact_response() const {
|
||||
|
||||
return get_object()->hasContactResponse();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_contact_processing_threshold
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletBodyNode::
|
||||
get_contact_processing_threshold() const {
|
||||
|
||||
return get_object()->getContactProcessingThreshold();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::set_contact_processing_threshold
|
||||
// Access: Published
|
||||
// Description: The constraint solver can discard solving
|
||||
// contacts, if the distance is above this threshold.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletBodyNode::
|
||||
set_contact_processing_threshold(float threshold) {
|
||||
|
||||
get_object()->setContactProcessingThreshold(threshold);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_ccd_swept_sphere_radius
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletBodyNode::
|
||||
get_ccd_swept_sphere_radius() const {
|
||||
|
||||
return get_object()->getCcdSweptSphereRadius();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::set_ccd_swept_sphere_radius
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletBodyNode::
|
||||
set_ccd_swept_sphere_radius(float radius) {
|
||||
|
||||
return get_object()->setCcdSweptSphereRadius(radius);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::get_ccd_motion_threshold
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletBodyNode::
|
||||
get_ccd_motion_threshold() const {
|
||||
|
||||
return get_object()->getCcdMotionThreshold();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::set_ccd_motion_threshold
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletBodyNode::
|
||||
set_ccd_motion_threshold(float threshold) {
|
||||
|
||||
return get_object()->setCcdMotionThreshold(threshold);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBodyNode::add_shapes_from_collision_solids
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletBodyNode::
|
||||
add_shapes_from_collision_solids(CollisionNode *cnode) {
|
||||
|
||||
PT(BulletTriangleMesh) mesh = NULL;
|
||||
|
||||
for (int j=0; j<cnode->get_num_solids(); j++) {
|
||||
CPT(CollisionSolid) solid = cnode->get_solid(j);
|
||||
TypeHandle type = solid->get_type();
|
||||
|
||||
// CollisionSphere
|
||||
if (CollisionSphere::get_class_type() == type) {
|
||||
CPT(CollisionSphere) sphere = DCAST(CollisionSphere, solid);
|
||||
CPT(TransformState) ts = TransformState::make_pos(sphere->get_center());
|
||||
|
||||
add_shape(BulletSphereShape::make_from_solid(sphere), ts);
|
||||
}
|
||||
|
||||
// CollisionBox
|
||||
else if (CollisionBox::get_class_type() == type) {
|
||||
CPT(CollisionBox) box = DCAST(CollisionBox, solid);
|
||||
CPT(TransformState) ts = TransformState::make_pos(box->get_approx_center());
|
||||
|
||||
add_shape(BulletBoxShape::make_from_solid(box), ts);
|
||||
}
|
||||
|
||||
// CollisionPlane
|
||||
else if (CollisionPlane::get_class_type() == type) {
|
||||
CPT(CollisionPlane) plane = DCAST(CollisionPlane, solid);
|
||||
|
||||
add_shape(BulletPlaneShape::make_from_solid(plane));
|
||||
}
|
||||
|
||||
// CollisionGeom
|
||||
else if (CollisionPolygon::get_class_type() == type) {
|
||||
CPT(CollisionPolygon) polygon = DCAST(CollisionPolygon, solid);
|
||||
|
||||
if (!mesh) {
|
||||
mesh = new BulletTriangleMesh();
|
||||
}
|
||||
|
||||
for (int i=2; i < polygon->get_num_points(); i++ ) {
|
||||
LPoint3f p1 = polygon->get_point(0);
|
||||
LPoint3f p2 = polygon->get_point(i-1);
|
||||
LPoint3f p3 = polygon->get_point(i);
|
||||
|
||||
mesh->add_triangle(p1, p2, p3, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mesh && mesh->get_num_triangles() > 0) {
|
||||
add_shape(new BulletTriangleMeshShape(mesh, true));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,152 @@
|
|||
// Filename: bulletBodyNode.h
|
||||
// Created by: enn0x (19Nov10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_BODY_NODE_H__
|
||||
#define __BULLET_BODY_NODE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
|
||||
#include "pandaNode.h"
|
||||
#include "collideMask.h"
|
||||
#include "collisionNode.h"
|
||||
#include "transformState.h"
|
||||
|
||||
class BulletShape;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletBodyNode
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletBodyNode : public PandaNode {
|
||||
|
||||
PUBLISHED:
|
||||
BulletBodyNode(const char *name);
|
||||
INLINE ~BulletBodyNode();
|
||||
|
||||
// Shapes
|
||||
void add_shape(BulletShape *shape, CPT(TransformState) xform=NULL);
|
||||
void remove_shape(BulletShape *shape);
|
||||
|
||||
INLINE int get_num_shapes() const;
|
||||
INLINE BulletShape *get_shape(int idx) const;
|
||||
MAKE_SEQ(get_shapes, get_num_shapes, get_shape);
|
||||
|
||||
LPoint3f get_shape_pos(int idx) const;
|
||||
LMatrix4f get_shape_mat(int idx) const;
|
||||
|
||||
void add_shapes_from_collision_solids(CollisionNode *cnode);
|
||||
|
||||
// Static and kinematic
|
||||
INLINE bool is_static() const;
|
||||
INLINE bool is_kinematic() const;
|
||||
|
||||
INLINE void set_static(bool value);
|
||||
INLINE void set_kinematic(bool value);
|
||||
|
||||
// Contacts
|
||||
INLINE void notify_collisions(bool value);
|
||||
INLINE bool notifies_collisions() const;
|
||||
|
||||
bool check_collision_with(PandaNode *node);
|
||||
|
||||
bool has_contact_response() const;
|
||||
|
||||
float get_contact_processing_threshold() const;
|
||||
void set_contact_processing_threshold(float threshold);
|
||||
|
||||
// Deactivation
|
||||
bool is_active() const;
|
||||
void set_active(bool active, bool force=false);
|
||||
|
||||
void set_deactivation_time(float dt);
|
||||
float get_deactivation_time() const;
|
||||
|
||||
void set_disable_deactivation(bool disable, bool force=false);
|
||||
bool get_disable_deactivation() const;
|
||||
|
||||
// Friction and Restitution
|
||||
INLINE float get_restitution() const;
|
||||
INLINE void set_restitution(float restitution);
|
||||
|
||||
INLINE float get_friction() const;
|
||||
INLINE void set_friction(float friction);
|
||||
|
||||
INLINE bool has_anisotropic_friction() const;
|
||||
void set_anisotropic_friction(const LVecBase3f &friction);
|
||||
LVecBase3f get_anisotropic_friction() const;
|
||||
|
||||
// CCD
|
||||
float get_ccd_swept_sphere_radius() const;
|
||||
float get_ccd_motion_threshold() const;
|
||||
void set_ccd_swept_sphere_radius(float radius);
|
||||
void set_ccd_motion_threshold(float threshold);
|
||||
|
||||
public:
|
||||
virtual btCollisionObject *get_object() const = 0;
|
||||
|
||||
virtual CollideMask get_legal_collide_mask() const;
|
||||
|
||||
virtual bool safe_to_flatten() const;
|
||||
virtual bool safe_to_transform() const;
|
||||
virtual bool safe_to_modify_transform() const;
|
||||
virtual bool safe_to_combine() const;
|
||||
virtual bool safe_to_combine_children() const;
|
||||
virtual bool safe_to_flatten_below() const;
|
||||
|
||||
protected:
|
||||
INLINE void set_collision_flag(int flag, bool value);
|
||||
INLINE bool get_collision_flag(int flag) const;
|
||||
|
||||
btCollisionShape *_shape;
|
||||
|
||||
typedef PTA(PT(BulletShape)) BulletShapes;
|
||||
BulletShapes _shapes;
|
||||
|
||||
bool _disable_transform_changed;
|
||||
virtual void transform_changed();
|
||||
|
||||
private:
|
||||
virtual void shape_changed();
|
||||
|
||||
static bool is_identity(btTransform &trans);
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
PandaNode::init_type();
|
||||
register_type(_type_handle, "BulletBodyNode",
|
||||
PandaNode::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletBodyNode.I"
|
||||
|
||||
#endif // __BULLET_BODY_NODE_H__
|
||||
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
// Filename: bulletBoxShape.I
|
||||
// Created by: enn0x (24Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBoxShape::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletBoxShape::
|
||||
~BulletBoxShape() {
|
||||
|
||||
delete _shape;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
// Filename: bulletBoxShape.cxx
|
||||
// Created by: enn0x (24Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletBoxShape.h"
|
||||
#include "bullet_utils.h"
|
||||
|
||||
TypeHandle BulletBoxShape::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBoxShape::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletBoxShape::
|
||||
BulletBoxShape(const LVecBase3f &halfExtents) {
|
||||
|
||||
btVector3 btHalfExtents = LVecBase3f_to_btVector3(halfExtents);
|
||||
|
||||
_shape = new btBoxShape(btHalfExtents);
|
||||
_shape->setUserPointer(this);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBoxShape::ptr
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btCollisionShape *BulletBoxShape::
|
||||
ptr() const {
|
||||
|
||||
return _shape;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBoxShape::get_half_extents_without_marging
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LVecBase3f BulletBoxShape::
|
||||
get_half_extents_without_marging() const {
|
||||
|
||||
return btVector3_to_LVecBase3f(_shape->getHalfExtentsWithoutMargin());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBoxShape::get_half_extents_with_marging
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LVecBase3f BulletBoxShape::
|
||||
get_half_extents_with_marging() const {
|
||||
|
||||
return btVector3_to_LVecBase3f(_shape->getHalfExtentsWithMargin());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletBoxShape::make_from_solid
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletBoxShape *BulletBoxShape::
|
||||
make_from_solid(const CollisionBox *solid) {
|
||||
|
||||
LPoint3f p0 = solid->get_min();
|
||||
LPoint3f p1 = solid->get_max();
|
||||
|
||||
LVecBase3f extents(p1.get_x() - p0.get_x() / 2.0,
|
||||
p1.get_y() - p0.get_y() / 2.0,
|
||||
p1.get_z() - p0.get_z() / 2.0);
|
||||
|
||||
return new BulletBoxShape(extents);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
// Filename: bulletBoxShape.h
|
||||
// Created by: enn0x (24Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_BOX_SHAPE_H__
|
||||
#define __BULLET_BOX_SHAPE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bulletShape.h"
|
||||
|
||||
#include "lvector3.h"
|
||||
|
||||
#include "collisionBox.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletBoxShape
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletBoxShape : public BulletShape {
|
||||
|
||||
PUBLISHED:
|
||||
BulletBoxShape(const LVecBase3f &halfExtents);
|
||||
INLINE ~BulletBoxShape();
|
||||
|
||||
LVecBase3f get_half_extents_without_marging() const;
|
||||
LVecBase3f get_half_extents_with_marging() const;
|
||||
|
||||
static BulletBoxShape *make_from_solid(const CollisionBox *solid);
|
||||
|
||||
public:
|
||||
virtual btCollisionShape *ptr() const;
|
||||
|
||||
private:
|
||||
btBoxShape *_shape;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletShape::init_type();
|
||||
register_type(_type_handle, "BulletBoxShape",
|
||||
BulletShape::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletBoxShape.I"
|
||||
|
||||
#endif // __BULLET_BOX_SHAPE_H__
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
// Filename: bulletCapsuleShape.I
|
||||
// Created by: enn0x (27Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCapsuleShape::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletCapsuleShape::
|
||||
~BulletCapsuleShape() {
|
||||
|
||||
delete _shape;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCapsuleShape::get_radius
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletCapsuleShape::
|
||||
get_radius() const {
|
||||
|
||||
return _shape->getRadius();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCapsuleShape::get_half_height
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletCapsuleShape::
|
||||
get_half_height() const {
|
||||
|
||||
return _shape->getHalfHeight();
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
// Filename: bulletCapsuleShape.cxx
|
||||
// Created by: enn0x (27Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletCapsuleShape.h"
|
||||
|
||||
TypeHandle BulletCapsuleShape::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCapsuleShape::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletCapsuleShape::
|
||||
BulletCapsuleShape(float radius, float height, BulletUpAxis up) {
|
||||
|
||||
switch (up) {
|
||||
case X_up:
|
||||
_shape = new btCapsuleShapeX(radius, height);
|
||||
break;
|
||||
case Y_up:
|
||||
_shape = new btCapsuleShape(radius, height);
|
||||
break;
|
||||
case Z_up:
|
||||
_shape = new btCapsuleShapeZ(radius, height);
|
||||
break;
|
||||
default:
|
||||
bullet_cat.error() << "invalid up-axis:" << up << endl;
|
||||
break;
|
||||
}
|
||||
|
||||
_shape->setUserPointer(this);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCapsuleShape::ptr
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btCollisionShape *BulletCapsuleShape::
|
||||
ptr() const {
|
||||
|
||||
return _shape;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
// Filename: bulletCapsuleShape.h
|
||||
// Created by: enn0x (27Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_CAPSULE_SHAPE_H__
|
||||
#define __BULLET_CAPSULE_SHAPE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletShape.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletCapsuleShape
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletCapsuleShape : public BulletShape {
|
||||
|
||||
PUBLISHED:
|
||||
BulletCapsuleShape(float radius, float height, BulletUpAxis up=Z_up);
|
||||
INLINE ~BulletCapsuleShape();
|
||||
|
||||
INLINE float get_radius() const;
|
||||
INLINE float get_half_height() const;
|
||||
|
||||
public:
|
||||
virtual btCollisionShape *ptr() const;
|
||||
|
||||
private:
|
||||
btCapsuleShape *_shape;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletShape::init_type();
|
||||
register_type(_type_handle, "BulletCapsuleShape",
|
||||
BulletShape::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletCapsuleShape.I"
|
||||
|
||||
#endif // __BULLET_CAPSULE_SHAPE_H__
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
// Filename: bulletCharacterControllerNode.I
|
||||
// Created by: enn0x (21Nov10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletCharacterControllerNode::
|
||||
~BulletCharacterControllerNode() {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::get_ghost
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE btPairCachingGhostObject *BulletCharacterControllerNode::
|
||||
get_ghost() const {
|
||||
|
||||
return _ghost;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::get_character
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE btKinematicCharacterController *BulletCharacterControllerNode::
|
||||
get_character() const {
|
||||
|
||||
return _character;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,434 @@
|
|||
// Filename: bulletCharacterControllerNode.cxx
|
||||
// Created by: enn0x (21Nov10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletCharacterControllerNode.h"
|
||||
|
||||
TypeHandle BulletCharacterControllerNode::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletCharacterControllerNode::
|
||||
BulletCharacterControllerNode(BulletShape *shape, float step_height, const char *name) : PandaNode(name) {
|
||||
|
||||
// Setup initial transform
|
||||
btTransform trans = btTransform::getIdentity();
|
||||
|
||||
// Get convex shape
|
||||
if (!shape->is_convex()) {
|
||||
bullet_cat.error() << "a convex shape is required!" << endl;
|
||||
}
|
||||
|
||||
btConvexShape *convex = dynamic_cast<btConvexShape *>(shape->ptr());
|
||||
|
||||
// Setup ghost object
|
||||
_ghost = new btPairCachingGhostObject();
|
||||
_ghost->setUserPointer(this);
|
||||
|
||||
_ghost->setWorldTransform(trans);
|
||||
_ghost->setInterpolationWorldTransform(trans);
|
||||
_ghost->setCollisionShape(convex);
|
||||
_ghost->setCollisionFlags(btCollisionObject::CF_CHARACTER_OBJECT
|
||||
| btCollisionObject::CF_KINEMATIC_OBJECT);
|
||||
|
||||
// Setup up axis
|
||||
_up = get_default_up_axis();
|
||||
|
||||
// Movement
|
||||
_linear_velocity_is_local = false;
|
||||
_linear_velocity.set(0.0f, 0.0f, 0.0f);
|
||||
_angular_velocity = 0.0f;
|
||||
|
||||
// Setup character controller
|
||||
_character = new btKinematicCharacterController(_ghost, convex, step_height, _up);
|
||||
_character->setGravity((btScalar)9.81f);
|
||||
|
||||
// Retain a pointer to the shape
|
||||
_shape = shape;
|
||||
|
||||
// The 'transform changed' hook has to be disabled when updating the node's
|
||||
// transform from inside the post_step method!
|
||||
_disable_transform_changed = false;
|
||||
|
||||
// Default collide mask
|
||||
set_into_collide_mask(CollideMask::all_on());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::get_legal_collide_mask
|
||||
// Access: Public, virtual
|
||||
// Description: Returns the subset of CollideMask bits that may be
|
||||
// set for this particular type of PandaNode. For
|
||||
// CharacterControllerNodes this returns all bits on.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
CollideMask BulletCharacterControllerNode::
|
||||
get_legal_collide_mask() const {
|
||||
|
||||
return CollideMask::all_on();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::safe_to_flatten
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is generally safe to flatten out
|
||||
// this particular kind of Node by duplicating
|
||||
// instances, false otherwise (for instance, a Camera
|
||||
// cannot be safely flattened, because the Camera
|
||||
// pointer itself is meaningful).
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletCharacterControllerNode::
|
||||
safe_to_flatten() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::safe_to_modify_transform
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is safe to automatically adjust
|
||||
// the transform on this kind of node. Usually, this is
|
||||
// only a bad idea if the user expects to find a
|
||||
// particular transform on the node.
|
||||
//
|
||||
// ModelNodes with the preserve_transform flag set are
|
||||
// presently the only kinds of nodes that should not
|
||||
// have their transform even adjusted.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletCharacterControllerNode::
|
||||
safe_to_modify_transform() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::safe_to_combine
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is generally safe to combine this
|
||||
// particular kind of PandaNode with other kinds of
|
||||
// PandaNodes of compatible type, adding children or
|
||||
// whatever. For instance, an LODNode should not be
|
||||
// combined with any other PandaNode, because its set of
|
||||
// children is meaningful.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletCharacterControllerNode::
|
||||
safe_to_combine() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::safe_to_combine_children
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is generally safe to combine the
|
||||
// children of this PandaNode with each other. For
|
||||
// instance, an LODNode's children should not be
|
||||
// combined with each other, because the set of children
|
||||
// is meaningful.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletCharacterControllerNode::
|
||||
safe_to_combine_children() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::safe_to_flatten_below
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if a flatten operation may safely
|
||||
// continue past this node, or false if nodes below this
|
||||
// node may not be molested.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletCharacterControllerNode::
|
||||
safe_to_flatten_below() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::safe_to_transform
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is generally safe to transform
|
||||
// this particular kind of Node by calling the xform()
|
||||
// method, false otherwise. For instance, it's usually
|
||||
// a bad idea to attempt to xform a Character.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletCharacterControllerNode::
|
||||
safe_to_transform() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::set_linear_velocity
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
set_linear_velocity(const LVector3f &velocity, bool is_local) {
|
||||
|
||||
nassertv(!velocity.is_nan());
|
||||
|
||||
_linear_velocity = velocity;
|
||||
_linear_velocity_is_local = is_local;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::set_angular_velocity
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
set_angular_velocity(float omega) {
|
||||
|
||||
_angular_velocity = omega;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::pre_step
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
pre_step(float dt) {
|
||||
|
||||
// Angular rotation
|
||||
btScalar angle = dt * deg_2_rad(_angular_velocity);
|
||||
|
||||
btMatrix3x3 m = _ghost->getWorldTransform().getBasis();
|
||||
btVector3 up = m[_up];
|
||||
|
||||
m *= btMatrix3x3(btQuaternion(up, angle));
|
||||
|
||||
_ghost->getWorldTransform().setBasis(m);
|
||||
|
||||
// Linear movement
|
||||
btVector3 v;
|
||||
if (_linear_velocity_is_local) {
|
||||
btTransform xform;
|
||||
xform = _ghost->getWorldTransform();
|
||||
xform.setOrigin(btVector3(0.0f, 0.0f, 0.0f));
|
||||
v = xform(LVecBase3f_to_btVector3(_linear_velocity));
|
||||
}
|
||||
else {
|
||||
v = LVecBase3f_to_btVector3(_linear_velocity);
|
||||
}
|
||||
|
||||
_character->setVelocityForTimeInterval(v, dt);
|
||||
//_character->setWalkDirection(v * dt);
|
||||
|
||||
_angular_velocity = 0.0f;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::post_step
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
post_step() {
|
||||
|
||||
btTransform& trans = _ghost->getWorldTransform();
|
||||
CPT(TransformState) ts = btTrans_to_TransformState(trans);
|
||||
|
||||
_disable_transform_changed = true;
|
||||
|
||||
NodePath np = NodePath::any_path((PandaNode *)this);
|
||||
np.set_transform(np.get_top(), ts);
|
||||
|
||||
_disable_transform_changed = false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::transform_changed
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
transform_changed() {
|
||||
|
||||
if (_disable_transform_changed) return;
|
||||
|
||||
// Get translation and heading
|
||||
NodePath np = NodePath::any_path((PandaNode *)this);
|
||||
CPT(TransformState) ts = np.get_transform(np.get_top());
|
||||
|
||||
LPoint3f pos = ts->get_pos();
|
||||
float heading = ts->get_hpr().get_x();
|
||||
|
||||
// Set translation
|
||||
_character->warp(LVecBase3f_to_btVector3(pos));
|
||||
|
||||
// Set Heading
|
||||
btMatrix3x3 m = _ghost->getWorldTransform().getBasis();
|
||||
btVector3 up = m[_up];
|
||||
|
||||
m = btMatrix3x3(btQuaternion(up, heading));
|
||||
|
||||
_ghost->getWorldTransform().setBasis(m);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::get_shape
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletShape *BulletCharacterControllerNode::
|
||||
get_shape() const {
|
||||
|
||||
return _shape;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::is_on_ground
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletCharacterControllerNode::
|
||||
is_on_ground() const {
|
||||
|
||||
return _character->onGround();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::can_jump
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletCharacterControllerNode::
|
||||
can_jump() const {
|
||||
|
||||
return _character->canJump();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::do_jump
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
do_jump() {
|
||||
|
||||
_character->jump();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::set_fall_speed
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
set_fall_speed(float fall_speed) {
|
||||
|
||||
_character->setFallSpeed(fall_speed);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::set_jump_speed
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
set_jump_speed(float jump_speed) {
|
||||
|
||||
_character->setJumpSpeed(jump_speed);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::set_max_jump_height
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
set_max_jump_height(float max_jump_height) {
|
||||
|
||||
_character->setMaxJumpHeight(max_jump_height);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::set_max_slope
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
set_max_slope(float max_slope) {
|
||||
|
||||
_character->setMaxSlope(max_slope);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::get_max_slope
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletCharacterControllerNode::
|
||||
get_max_slope() const {
|
||||
|
||||
return _character->getMaxSlope();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::get_gravity
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletCharacterControllerNode::
|
||||
get_gravity() const {
|
||||
|
||||
return _character->getGravity();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::set_gravity
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
set_gravity(float gravity) {
|
||||
|
||||
_character->setGravity((btScalar) gravity);
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::set_use_ghost_sweep_test
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
set_use_ghost_sweep_test(bool value) {
|
||||
|
||||
return _character->setUseGhostSweepTest(value);
|
||||
}
|
||||
|
||||
/*
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::parents_changed
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
parents_changed() {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCharacterControllerNode::children_changed
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletCharacterControllerNode::
|
||||
children_changed() {
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
|
|
@ -0,0 +1,119 @@
|
|||
// Filename: bulletCharacterControllerNode.h
|
||||
// Created by: enn0x (21Nov10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_CHARACTER_CONTROLLER_NODE_H__
|
||||
#define __BULLET_CHARACTER_CONTROLLER_NODE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletShape.h"
|
||||
|
||||
#include "pandaNode.h"
|
||||
#include "collideMask.h"
|
||||
#include "luse.h"
|
||||
#include "transformState.h"
|
||||
#include "nodePath.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletCharacterControllerNode
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletCharacterControllerNode : public PandaNode {
|
||||
|
||||
PUBLISHED:
|
||||
BulletCharacterControllerNode(BulletShape *shape, float step_height, const char *name="character");
|
||||
INLINE ~BulletCharacterControllerNode();
|
||||
|
||||
void set_linear_velocity(const LVector3f &velocity, bool is_local);
|
||||
void set_angular_velocity(float omega);
|
||||
|
||||
BulletShape *get_shape() const;
|
||||
|
||||
float get_gravity() const;
|
||||
float get_max_slope() const;
|
||||
|
||||
void set_fall_speed(float fall_speed);
|
||||
void set_jump_speed(float jump_speed);
|
||||
void set_max_jump_height(float max_jump_height);
|
||||
void set_max_slope(float max_slope);
|
||||
void set_gravity(float gravity);
|
||||
void set_use_ghost_sweep_test(bool value);
|
||||
|
||||
bool is_on_ground() const;
|
||||
bool can_jump() const;
|
||||
void do_jump();
|
||||
|
||||
public:
|
||||
virtual CollideMask get_legal_collide_mask() const;
|
||||
|
||||
virtual bool safe_to_flatten() const;
|
||||
virtual bool safe_to_transform() const;
|
||||
virtual bool safe_to_modify_transform() const;
|
||||
virtual bool safe_to_combine() const;
|
||||
virtual bool safe_to_combine_children() const;
|
||||
virtual bool safe_to_flatten_below() const;
|
||||
|
||||
INLINE btPairCachingGhostObject *get_ghost() const;
|
||||
INLINE btKinematicCharacterController *get_character() const;
|
||||
|
||||
void pre_step(float dt);
|
||||
void post_step();
|
||||
|
||||
protected:
|
||||
//virtual void parents_changed();
|
||||
//virtual void children_changed();
|
||||
virtual void transform_changed();
|
||||
|
||||
private:
|
||||
BulletUpAxis _up;
|
||||
|
||||
btKinematicCharacterController *_character;
|
||||
btPairCachingGhostObject *_ghost;
|
||||
|
||||
PT(BulletShape) _shape;
|
||||
|
||||
LVector3f _linear_velocity;
|
||||
bool _linear_velocity_is_local;
|
||||
float _angular_velocity;
|
||||
|
||||
bool _disable_transform_changed;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
PandaNode::init_type();
|
||||
register_type(_type_handle, "BulletCharacterControllerNode",
|
||||
PandaNode::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletCharacterControllerNode.I"
|
||||
|
||||
#endif // __BULLET_CHARACTER_CONTROLLER_NODE_H__
|
||||
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
// Filename: bulletClosestHitRayResult.I
|
||||
// Created by: enn0x (21Feb10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitRayResult::empty
|
||||
// Access: Public
|
||||
// Description: Named constructor intended to be used for asserts
|
||||
// with have to return a concrete value.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletClosestHitRayResult BulletClosestHitRayResult::
|
||||
empty() {
|
||||
|
||||
btVector3 from;
|
||||
btVector3 to;
|
||||
|
||||
return BulletClosestHitRayResult(from, to, CollideMask::all_on());
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
// Filename: bulletClosestHitRayResult.cxx
|
||||
// Created by: enn0x (21Feb10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletClosestHitRayResult.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitRayResult::Constructor
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletClosestHitRayResult::
|
||||
BulletClosestHitRayResult(const btVector3 &from_pos, const btVector3 &to_pos, const CollideMask &mask)
|
||||
: btCollisionWorld::ClosestRayResultCallback(from_pos, to_pos), _mask(mask) {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitRayResult::needsCollision
|
||||
// Access: Protected
|
||||
// Description: Override default implementation.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletClosestHitRayResult::
|
||||
needsCollision(btBroadphaseProxy* proxy0) const {
|
||||
|
||||
// Original implementation:
|
||||
//bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
|
||||
//collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
|
||||
//return collides;
|
||||
|
||||
btCollisionObject *obj0 = (btCollisionObject *) proxy0->m_clientObject;
|
||||
PandaNode *node0 = (PandaNode *) obj0->getUserPointer();
|
||||
CollideMask mask0 = node0->get_into_collide_mask();
|
||||
|
||||
return (_mask & mask0) != 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitRayResult::has_hit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletClosestHitRayResult::
|
||||
has_hit() const {
|
||||
|
||||
return hasHit();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitRayResult::get_hit_fraction
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletClosestHitRayResult::
|
||||
get_hit_fraction() const {
|
||||
|
||||
return m_closestHitFraction;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitRayResult::get_node
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
PandaNode *BulletClosestHitRayResult::
|
||||
get_node() const {
|
||||
|
||||
btCollisionObject *objectPtr = m_collisionObject;
|
||||
return (objectPtr) ? (PandaNode *)objectPtr->getUserPointer() : NULL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitRayResult::get_hit_pos
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletClosestHitRayResult::
|
||||
get_hit_pos() const {
|
||||
|
||||
return btVector3_to_LPoint3f(m_hitPointWorld);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitRayResult::get_hit_normal
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LVector3f BulletClosestHitRayResult::
|
||||
get_hit_normal() const {
|
||||
|
||||
return btVector3_to_LVector3f(m_hitNormalWorld);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitRayResult::get_from_pos
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletClosestHitRayResult::
|
||||
get_from_pos() const {
|
||||
|
||||
return btVector3_to_LPoint3f(m_rayFromWorld);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitRayResult::get_to_pos
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletClosestHitRayResult::
|
||||
get_to_pos() const {
|
||||
|
||||
return btVector3_to_LPoint3f(m_rayToWorld);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
// Filename: bulletClosestHitRayResult.h
|
||||
// Created by: enn0x (21Feb10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_CLOSEST_HIT_RAY_RESULT_H__
|
||||
#define __BULLET_CLOSEST_HIT_RAY_RESULT_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
|
||||
#include "luse.h"
|
||||
#include "pandaNode.h"
|
||||
#include "collideMask.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletClosestHitRayResult
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
struct EXPCL_PANDABULLET BulletClosestHitRayResult : public btCollisionWorld::ClosestRayResultCallback {
|
||||
|
||||
PUBLISHED:
|
||||
INLINE static BulletClosestHitRayResult empty();
|
||||
|
||||
LPoint3f get_from_pos() const;
|
||||
LPoint3f get_to_pos() const;
|
||||
|
||||
bool has_hit() const;
|
||||
|
||||
PandaNode *get_node() const;
|
||||
LPoint3f get_hit_pos() const;
|
||||
LVector3f get_hit_normal() const;
|
||||
float get_hit_fraction() const;
|
||||
|
||||
public:
|
||||
virtual bool needsCollision(btBroadphaseProxy* proxy0) const;
|
||||
|
||||
private:
|
||||
BulletClosestHitRayResult(const btVector3 &from_pos, const btVector3 &to_pos, const CollideMask &mask);
|
||||
|
||||
CollideMask _mask;
|
||||
|
||||
friend class BulletWorld;
|
||||
};
|
||||
|
||||
#include "bulletClosestHitRayResult.I"
|
||||
|
||||
#endif // __BULLET_CLOSEST_HIT_RAY_RESULT_H__
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
// Filename: bulletClosestHitSweepResult.I
|
||||
// Created by: enn0x (01Dec10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestSweepRayResult::empty
|
||||
// Access: Public
|
||||
// Description: Named constructor intended to be used for asserts
|
||||
// with have to return a concrete value.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletClosestHitSweepResult BulletClosestHitSweepResult::
|
||||
empty() {
|
||||
|
||||
btVector3 from;
|
||||
btVector3 to;
|
||||
|
||||
return BulletClosestHitSweepResult(from, to, CollideMask::all_on());
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
// Filename: bulletClosestHitSweepResult.cxx
|
||||
// Created by: enn0x (01Dec10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletClosestHitSweepResult.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitSweepResult::Constructor
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletClosestHitSweepResult::
|
||||
BulletClosestHitSweepResult(const btVector3 &from_pos, const btVector3 &to_pos, const CollideMask &mask)
|
||||
: btCollisionWorld::ClosestConvexResultCallback(from_pos, to_pos), _mask(mask) {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitSweepResult::needsCollision
|
||||
// Access: Protected
|
||||
// Description: Override default implementation.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletClosestHitSweepResult::
|
||||
needsCollision(btBroadphaseProxy* proxy0) const {
|
||||
|
||||
// Original implementation:
|
||||
//bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
|
||||
//collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
|
||||
//return collides;
|
||||
|
||||
btCollisionObject *obj0 = (btCollisionObject *) proxy0->m_clientObject;
|
||||
PandaNode *node0 = (PandaNode *) obj0->getUserPointer();
|
||||
CollideMask mask0 = node0->get_into_collide_mask();
|
||||
|
||||
return (_mask & mask0) != 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitSweepResult::has_hit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletClosestHitSweepResult::
|
||||
has_hit() const {
|
||||
|
||||
return hasHit();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitSweepResult::get_hit_fraction
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletClosestHitSweepResult::
|
||||
get_hit_fraction() const {
|
||||
|
||||
return m_closestHitFraction;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitSweepResult::get_node
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
PandaNode *BulletClosestHitSweepResult::
|
||||
get_node() const {
|
||||
|
||||
btCollisionObject *objectPtr = m_hitCollisionObject;
|
||||
return (objectPtr) ? (PandaNode *)objectPtr->getUserPointer() : NULL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitSweepResult::get_hit_pos
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletClosestHitSweepResult::
|
||||
get_hit_pos() const {
|
||||
|
||||
return btVector3_to_LPoint3f(m_hitPointWorld);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitSweepResult::get_hit_normal
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LVector3f BulletClosestHitSweepResult::
|
||||
get_hit_normal() const {
|
||||
|
||||
return btVector3_to_LVector3f(m_hitNormalWorld);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitSweepResult::get_from_pos
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletClosestHitSweepResult::
|
||||
get_from_pos() const {
|
||||
|
||||
return btVector3_to_LPoint3f(m_convexFromWorld);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletClosestHitSweepResult::get_to_pos
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletClosestHitSweepResult::
|
||||
get_to_pos() const {
|
||||
|
||||
return btVector3_to_LPoint3f(m_convexToWorld);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
// Filename: bulletClosestHitSweepResult.h
|
||||
// Created by: enn0x (01Dec10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_CLOSEST_HIT_SWEEP_RESULT_H__
|
||||
#define __BULLET_CLOSEST_HIT_SWEEP_RESULT_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
|
||||
#include "luse.h"
|
||||
#include "pandaNode.h"
|
||||
#include "collideMask.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletClosestHitSweepResult
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
struct EXPCL_PANDABULLET BulletClosestHitSweepResult : public btCollisionWorld::ClosestConvexResultCallback {
|
||||
|
||||
PUBLISHED:
|
||||
INLINE static BulletClosestHitSweepResult empty();
|
||||
|
||||
LPoint3f get_from_pos() const;
|
||||
LPoint3f get_to_pos() const;
|
||||
|
||||
bool has_hit() const;
|
||||
|
||||
PandaNode *get_node() const;
|
||||
LPoint3f get_hit_pos() const;
|
||||
LVector3f get_hit_normal() const;
|
||||
float get_hit_fraction() const;
|
||||
|
||||
public:
|
||||
virtual bool needsCollision(btBroadphaseProxy* proxy0) const;
|
||||
|
||||
private:
|
||||
BulletClosestHitSweepResult(const btVector3 &from_pos, const btVector3 &to_pos, const CollideMask &mask);
|
||||
|
||||
CollideMask _mask;
|
||||
|
||||
friend class BulletWorld;
|
||||
};
|
||||
|
||||
#include "bulletClosestHitSweepResult.I"
|
||||
|
||||
#endif // __BULLET_CLOSEST_HIT_SWEEP_RESULT_H__
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
// Filename: bulletConeShape.I
|
||||
// Created by: enn0x (24Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConeShape::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletConeShape::
|
||||
~BulletConeShape() {
|
||||
|
||||
delete _shape;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConeShape::get_radius
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletConeShape::
|
||||
get_radius() const {
|
||||
|
||||
return _shape->getRadius();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConeShape::get_height
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletConeShape::
|
||||
get_height() const {
|
||||
|
||||
return _shape->getHeight();
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
// Filename: bulletConeShape.cxx
|
||||
// Created by: enn0x (24Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletConeShape.h"
|
||||
|
||||
TypeHandle BulletConeShape::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConeShape::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletConeShape::
|
||||
BulletConeShape(float radius, float height, BulletUpAxis up) {
|
||||
|
||||
switch (up) {
|
||||
case X_up:
|
||||
_shape = new btConeShapeX(radius, height);
|
||||
break;
|
||||
case Y_up:
|
||||
_shape = new btConeShape(radius, height);
|
||||
break;
|
||||
case Z_up:
|
||||
_shape = new btConeShapeZ(radius, height);
|
||||
break;
|
||||
default:
|
||||
bullet_cat.error() << "invalid up-axis:" << up << endl;
|
||||
break;
|
||||
}
|
||||
|
||||
_shape->setUserPointer(this);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConeShape::ptr
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btCollisionShape *BulletConeShape::
|
||||
ptr() const {
|
||||
|
||||
return _shape;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
// Filename: bulletConeShape.h
|
||||
// Created by: enn0x (24Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_CONE_SHAPE_H__
|
||||
#define __BULLET_CONE_SHAPE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletShape.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletConeShape
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletConeShape : public BulletShape {
|
||||
|
||||
PUBLISHED:
|
||||
BulletConeShape(float radius, float height, BulletUpAxis up=Z_up);
|
||||
INLINE ~BulletConeShape();
|
||||
|
||||
INLINE float get_radius() const;
|
||||
INLINE float get_height() const;
|
||||
|
||||
public:
|
||||
virtual btCollisionShape *ptr() const;
|
||||
|
||||
private:
|
||||
btConeShape *_shape;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletShape::init_type();
|
||||
register_type(_type_handle, "BulletConeShape",
|
||||
BulletShape::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletConeShape.I"
|
||||
|
||||
#endif // __BULLET_CONE_SHAPE_H__
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
// Filename: bulletConeTwistConstraint.I
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConeTwistConstraint::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletConeTwistConstraint::
|
||||
~BulletConeTwistConstraint() {
|
||||
|
||||
delete _constraint;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
// Filename: bulletConeTwistConstraint.cxx
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletConeTwistConstraint.h"
|
||||
#include "bulletRigidBodyNode.h"
|
||||
|
||||
#include "deg_2_rad.h"
|
||||
|
||||
TypeHandle BulletConeTwistConstraint::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConeTwistConstraint::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletConeTwistConstraint::
|
||||
BulletConeTwistConstraint(const BulletRigidBodyNode *node_a,
|
||||
const TransformState &frame_a) {
|
||||
|
||||
btRigidBody *ptr_a = btRigidBody::upcast(node_a->get_object());
|
||||
btTransform trans_a = LMatrix4f_to_btTrans(frame_a.get_mat());
|
||||
|
||||
_constraint = new btConeTwistConstraint(*ptr_a, trans_a);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConeTwistConstraint::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletConeTwistConstraint::
|
||||
BulletConeTwistConstraint(const BulletRigidBodyNode *node_a,
|
||||
const BulletRigidBodyNode *node_b,
|
||||
const TransformState &frame_a,
|
||||
const TransformState &frame_b) {
|
||||
|
||||
btRigidBody *ptr_a = btRigidBody::upcast(node_a->get_object());
|
||||
btTransform trans_a = LMatrix4f_to_btTrans(frame_a.get_mat());
|
||||
|
||||
btRigidBody *ptr_b = btRigidBody::upcast(node_b->get_object());
|
||||
btTransform trans_b = LMatrix4f_to_btTrans(frame_b.get_mat());
|
||||
|
||||
_constraint = new btConeTwistConstraint(*ptr_a, *ptr_b, trans_a, trans_b);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConeTwistConstraint::ptr
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btTypedConstraint *BulletConeTwistConstraint::
|
||||
ptr() const {
|
||||
|
||||
return _constraint;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConeTwistConstraint::set_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletConeTwistConstraint::
|
||||
set_limit(int index, float value) {
|
||||
|
||||
value = deg_2_rad(value);
|
||||
|
||||
_constraint->setLimit(index, value);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConeTwistConstraint::set_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletConeTwistConstraint::
|
||||
set_limit(float swing1, float swing2, float twist, float softness, float bias, float relaxation) {
|
||||
|
||||
swing1 = deg_2_rad(swing1);
|
||||
swing2 = deg_2_rad(swing2);
|
||||
twist = deg_2_rad(twist);
|
||||
|
||||
_constraint->setLimit(swing1, swing2, twist, softness, bias, relaxation);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
// Filename: bulletConeTwistConstraint.h
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_CONE_TWIST_CONSTRAINT_H__
|
||||
#define __BULLET_CONE_TWIST_CONSTRAINT_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletConstraint.h"
|
||||
|
||||
#include "transformState.h"
|
||||
|
||||
class BulletRigidBodyNode;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletConeTwistConstraint
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletConeTwistConstraint : public BulletConstraint {
|
||||
|
||||
PUBLISHED:
|
||||
BulletConeTwistConstraint(const BulletRigidBodyNode *node_a,
|
||||
const TransformState &frame_a);
|
||||
BulletConeTwistConstraint(const BulletRigidBodyNode *node_a,
|
||||
const BulletRigidBodyNode *node_b,
|
||||
const TransformState &frame_a,
|
||||
const TransformState &frame_b);
|
||||
INLINE ~BulletConeTwistConstraint();
|
||||
|
||||
void set_limit(int index, float value);
|
||||
void set_limit(float swing1, float swing2, float twist, float softness=1.0f, float bias=0.3f, float relaxation=1.0f);
|
||||
|
||||
public:
|
||||
virtual btTypedConstraint *ptr() const;
|
||||
|
||||
private:
|
||||
btConeTwistConstraint *_constraint;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletConstraint::init_type();
|
||||
register_type(_type_handle, "BulletConeTwistConstraint",
|
||||
BulletConstraint::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletConeTwistConstraint.I"
|
||||
|
||||
#endif // __BULLET_CONE_TWIST_CONSTRAINT_H__
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
// Filename: bulletConstraint.I
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConstraint::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletConstraint::
|
||||
~BulletConstraint() {
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
// Filename: bulletConstraint.cxx
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletConstraint.h"
|
||||
#include "bulletRigidBodyNode.h"
|
||||
|
||||
TypeHandle BulletConstraint::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConstraint::enable_feedback
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletConstraint::
|
||||
enable_feedback(bool value) {
|
||||
|
||||
ptr()->enableFeedback(value);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConstraint::get_applied_impulse
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletConstraint::
|
||||
get_applied_impulse() const {
|
||||
|
||||
return ptr()->getAppliedImpulse();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConstraint::set_dbg_draw_size
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletConstraint::
|
||||
set_debug_draw_size(float size) {
|
||||
|
||||
ptr()->setDbgDrawSize(size);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConstraint::get_dbg_draw_size
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletConstraint::
|
||||
get_debug_draw_size() {
|
||||
|
||||
return ptr()->getDbgDrawSize();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConstraint::get_rigid_body_a
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletRigidBodyNode *BulletConstraint::
|
||||
get_rigid_body_a() {
|
||||
|
||||
return (BulletRigidBodyNode *)ptr()->getRigidBodyA().getUserPointer();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConstraint::get_rigid_body_b
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletRigidBodyNode *BulletConstraint::
|
||||
get_rigid_body_b() {
|
||||
|
||||
return (BulletRigidBodyNode *)ptr()->getRigidBodyB().getUserPointer();
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
// Filename: bulletConstraint.h
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_CONSTRAINT_H__
|
||||
#define __BULLET_CONSTRAINT_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
|
||||
#include "typedReferenceCount.h"
|
||||
|
||||
class BulletRigidBodyNode;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletConstraint
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletConstraint : public TypedReferenceCount {
|
||||
|
||||
PUBLISHED:
|
||||
INLINE virtual ~BulletConstraint();
|
||||
|
||||
BulletRigidBodyNode *get_rigid_body_a();
|
||||
BulletRigidBodyNode *get_rigid_body_b();
|
||||
|
||||
void enable_feedback(bool value);
|
||||
void set_debug_draw_size(float size);
|
||||
|
||||
float get_applied_impulse() const;
|
||||
float get_debug_draw_size();
|
||||
|
||||
public:
|
||||
virtual btTypedConstraint *ptr() const = 0;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
TypedReferenceCount::init_type();
|
||||
register_type(_type_handle, "BulletConstraint",
|
||||
TypedReferenceCount::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletConstraint.I"
|
||||
|
||||
#endif // __BULLET_CONSTRAINT_H__
|
||||
|
|
@ -0,0 +1,128 @@
|
|||
// Filename: bulletContactCallbacks.h
|
||||
// Created by: enn0x (10Apr10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_CONTACT_CALLBACKS_H__
|
||||
#define __BULLET_CONTACT_CALLBACKS_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
|
||||
#include "config_bullet.h" // required for: bullet_cat.debug()
|
||||
|
||||
#include "event.h"
|
||||
#include "eventQueue.h"
|
||||
#include "eventParameter.h"
|
||||
#include "eventStorePandaNode.h"
|
||||
#include "pandaNode.h"
|
||||
|
||||
struct UserPersitentData {
|
||||
PT(PandaNode) node0;
|
||||
PT(PandaNode) node1;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: contact_added_callback
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
static bool
|
||||
contact_added_callback(btManifoldPoint &cp,
|
||||
const btCollisionObject *obj0,
|
||||
int id0,
|
||||
int index0,
|
||||
const btCollisionObject *obj1,
|
||||
int id1,
|
||||
int index1) {
|
||||
|
||||
if (cp.m_userPersistentData == NULL) {
|
||||
PT(PandaNode) node0 = (PandaNode *)obj0->getUserPointer();
|
||||
PT(PandaNode) node1 = (PandaNode *)obj1->getUserPointer();
|
||||
|
||||
bullet_cat.debug() << "contact added: " << cp.m_userPersistentData << endl;
|
||||
|
||||
// Gather persistent data
|
||||
UserPersitentData *data = new UserPersitentData();
|
||||
data->node0 = node0;
|
||||
data->node1 = node1;
|
||||
|
||||
cp.m_userPersistentData = (void *)data;
|
||||
|
||||
// Send event
|
||||
if (bullet_enable_contact_events) {
|
||||
|
||||
Event *event = new Event("bullet-contact-added");
|
||||
event->add_parameter(EventParameter(new EventStorePandaNode(node0)));
|
||||
event->add_parameter(EventParameter(new EventStorePandaNode(node1)));
|
||||
|
||||
EventQueue::get_global_event_queue()->queue_event(event);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: contact_processed_callback
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
static bool
|
||||
contact_processed_callback(btManifoldPoint &cp,
|
||||
void *body0,
|
||||
void *body1) {
|
||||
|
||||
/*
|
||||
btCollisionObject *obj0 = (btCollisionObject *)body0;
|
||||
btCollisionObject *colobj1Obj1 = (btCollisionObject *)body1;
|
||||
|
||||
int flags0 = obj0->getCollisionFlags();
|
||||
int flags1 = obj1->getCollisionFlags();
|
||||
|
||||
if ((flags0 & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK)
|
||||
|| (flags1 & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK)) {
|
||||
|
||||
// do something...
|
||||
}
|
||||
*/
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: contact_destroyed_callback
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
static bool
|
||||
contact_destroyed_callback(void *userPersistentData) {
|
||||
|
||||
bullet_cat.debug() << "contact removed: " << userPersistentData << endl;
|
||||
|
||||
UserPersitentData *data = (UserPersitentData *)userPersistentData;
|
||||
|
||||
// Send event
|
||||
if (bullet_enable_contact_events) {
|
||||
|
||||
Event *event = new Event("bullet-contact-destroyed");
|
||||
event->add_parameter(EventParameter(new EventStorePandaNode(data->node0)));
|
||||
event->add_parameter(EventParameter(new EventStorePandaNode(data->node1)));
|
||||
|
||||
EventQueue::get_global_event_queue()->queue_event(event);
|
||||
}
|
||||
|
||||
// Delete persitent data
|
||||
delete data;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif // __BULLET_CONTACT_CALLBACKS_H__
|
||||
|
|
@ -0,0 +1,115 @@
|
|||
// Filename: bulletContactResult.I
|
||||
// Created by: enn0x (08Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletContactResult::get_node0
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const PandaNode *BulletContact::
|
||||
get_node0() const {
|
||||
|
||||
return _obj0 ? (PandaNode *)_obj0->getUserPointer() : NULL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletContactResult::get_node1
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const PandaNode *BulletContact::
|
||||
get_node1() const {
|
||||
|
||||
return _obj1 ? (PandaNode *)_obj1->getUserPointer() : NULL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletContactResult::get_manifold_point
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const BulletManifoldPoint *BulletContact::
|
||||
get_manifold_point() const {
|
||||
|
||||
return new BulletManifoldPoint(*_mp);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletContactResult::get_idx0
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const int BulletContact::
|
||||
get_idx0() const {
|
||||
|
||||
return _idx0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletContactResult::get_idx1
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const int BulletContact::
|
||||
get_idx1() const {
|
||||
|
||||
return _idx1;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletContactResult::get_part_id0
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const int BulletContact::
|
||||
get_part_id0() const {
|
||||
|
||||
return _part_id0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletContactResult::get_part_id1
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const int BulletContact::
|
||||
get_part_id1() const {
|
||||
|
||||
return _part_id1;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletContactResult::get_num_contacts
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE int BulletContactResult::
|
||||
get_num_contacts() const {
|
||||
|
||||
return _contacts.size();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletContactResult::get_contact
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const BulletContact &BulletContactResult::
|
||||
get_contact(int idx) const {
|
||||
|
||||
nassertr(idx >= 0 && idx < (int)_contacts.size(), _empty);
|
||||
return _contacts[idx];
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
// Filename: bulletContactResult.cxx
|
||||
// Created by: enn0x (08Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletContactResult.h"
|
||||
|
||||
BulletContact BulletContactResult::_empty;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletContactResult::Constructor
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletContactResult::
|
||||
BulletContactResult() : btCollisionWorld::ContactResultCallback() {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletContactResult::addSingleResult
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btScalar BulletContactResult::
|
||||
addSingleResult(btManifoldPoint &mp,
|
||||
const btCollisionObject *obj0, int part_id0, int idx0,
|
||||
const btCollisionObject *obj1, int part_id1, int idx1) {
|
||||
|
||||
|
||||
BulletContact contact;
|
||||
|
||||
contact._mp = ∓
|
||||
contact._obj0 = obj0;
|
||||
contact._obj1 = obj1;
|
||||
contact._part_id0 = part_id0;
|
||||
contact._part_id1 = part_id1;
|
||||
contact._idx0 = idx0;
|
||||
contact._idx1 = idx1;
|
||||
|
||||
_contacts.push_back(contact);
|
||||
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
// Filename: bulletContactResult.h
|
||||
// Created by: enn0x (08Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_CONTACT_RESULT_H__
|
||||
#define __BULLET_CONTACT_RESULT_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bulletManifoldPoint.h"
|
||||
|
||||
#include "pvector.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletContact
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
struct EXPCL_PANDABULLET BulletContact {
|
||||
|
||||
PUBLISHED:
|
||||
INLINE const BulletManifoldPoint *get_manifold_point() const;
|
||||
INLINE const PandaNode *get_node0() const;
|
||||
INLINE const PandaNode *get_node1() const;
|
||||
INLINE const int get_idx0() const;
|
||||
INLINE const int get_idx1() const;
|
||||
INLINE const int get_part_id0() const;
|
||||
INLINE const int get_part_id1() const;
|
||||
|
||||
private:
|
||||
btManifoldPoint *_mp;
|
||||
const btCollisionObject *_obj0;
|
||||
const btCollisionObject *_obj1;
|
||||
int _part_id0;
|
||||
int _part_id1;
|
||||
int _idx0;
|
||||
int _idx1;
|
||||
|
||||
friend struct BulletContactResult;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletContactResult
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
struct EXPCL_PANDABULLET BulletContactResult : public btCollisionWorld::ContactResultCallback {
|
||||
|
||||
PUBLISHED:
|
||||
INLINE int get_num_contacts() const;
|
||||
INLINE const BulletContact &get_contact(int idx) const;
|
||||
MAKE_SEQ(get_contacts, get_num_contacts, get_contact);
|
||||
|
||||
public:
|
||||
virtual btScalar addSingleResult(btManifoldPoint &mp,
|
||||
const btCollisionObject *obj0, int part_id0, int idx0,
|
||||
const btCollisionObject *obj1, int part_id1, int idx1);
|
||||
|
||||
protected:
|
||||
BulletContactResult();
|
||||
|
||||
private:
|
||||
static BulletContact _empty;
|
||||
|
||||
pvector<BulletContact> _contacts;
|
||||
|
||||
friend class BulletWorld;
|
||||
};
|
||||
|
||||
#include "bulletContactResult.I"
|
||||
|
||||
#endif // __BULLET_CONTACT_RESULT_H__
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
// Filename: bulletConvexHullShape.I
|
||||
// Created by: enn0x (26Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConvexHullShape::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletConvexHullShape::
|
||||
~BulletConvexHullShape() {
|
||||
|
||||
delete _shape;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,102 @@
|
|||
// Filename: bulletConvexHullShape.cxx
|
||||
// Created by: enn0x (26Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletConvexHullShape.h"
|
||||
|
||||
#include "nodePathCollection.h"
|
||||
#include "geomNode.h"
|
||||
#include "geomVertexReader.h"
|
||||
|
||||
TypeHandle BulletConvexHullShape::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConvexHullShape::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletConvexHullShape::
|
||||
BulletConvexHullShape() {
|
||||
|
||||
_shape = new btConvexHullShape(NULL, 0);
|
||||
_shape->setUserPointer(this);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConvexHullShape::ptr
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btCollisionShape *BulletConvexHullShape::
|
||||
ptr() const {
|
||||
|
||||
return _shape;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConvexHullShape::add_point
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletConvexHullShape::
|
||||
add_point(const LPoint3f &p) {
|
||||
|
||||
_shape->addPoint(LVecBase3f_to_btVector3(p));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConvexHullShape::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletConvexHullShape::
|
||||
add_array(const PTA_LVecBase3f &points) {
|
||||
|
||||
_shape = new btConvexHullShape(NULL, 0);
|
||||
_shape->setUserPointer(this);
|
||||
|
||||
PTA_LVecBase3f::const_iterator it;
|
||||
for (it=points.begin(); it!=points.end(); it++) {
|
||||
LVecBase3f v = *it;
|
||||
_shape->addPoint(LVecBase3f_to_btVector3(v));
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConvexHullShape::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletConvexHullShape::
|
||||
add_geom(const Geom *geom) {
|
||||
|
||||
// Collect points
|
||||
pvector<LPoint3f> points;
|
||||
|
||||
CPT(GeomVertexData) vdata = geom->get_vertex_data();
|
||||
GeomVertexReader reader = GeomVertexReader(vdata, InternalName::get_vertex());
|
||||
|
||||
while (!reader.is_at_end()) {
|
||||
points.push_back(reader.get_data3f());
|
||||
}
|
||||
|
||||
// Create shape
|
||||
_shape = new btConvexHullShape(NULL, 0);
|
||||
_shape->setUserPointer(this);
|
||||
|
||||
pvector<LPoint3f>::const_iterator it;
|
||||
for (it=points.begin(); it!=points.end(); it++) {
|
||||
_shape->addPoint(LVecBase3f_to_btVector3(*it));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
// Filename: bulletConvexHullShape.h
|
||||
// Created by: enn0x (26Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_CONVEX_HULL_SHAPE_H__
|
||||
#define __BULLET_CONVEX_HULL_SHAPE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bulletShape.h"
|
||||
|
||||
#include "lpoint3.h"
|
||||
#include "geom.h"
|
||||
#include "pta_LVecBase3f.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletConvexHullShape
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletConvexHullShape : public BulletShape {
|
||||
|
||||
PUBLISHED:
|
||||
BulletConvexHullShape();
|
||||
INLINE ~BulletConvexHullShape();
|
||||
|
||||
void add_point(const LPoint3f &p);
|
||||
void add_array(const PTA_LVecBase3f &points);
|
||||
void add_geom(const Geom *geom);
|
||||
|
||||
public:
|
||||
virtual btCollisionShape *ptr() const;
|
||||
|
||||
private:
|
||||
btConvexHullShape *_shape;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletShape::init_type();
|
||||
register_type(_type_handle, "BulletConvexHullShape",
|
||||
BulletShape::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletConvexHullShape.I"
|
||||
|
||||
#endif // __BULLET_CONVEX_HULL_SHAPE_H__
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
// Filename: bulletConvexPointCloudShape.I
|
||||
// Created by: enn0x (30Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConvexPointCloudShape::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletConvexPointCloudShape::
|
||||
~BulletConvexPointCloudShape() {
|
||||
|
||||
delete _shape;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConvexPointCloudShape::get_num_points
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE int BulletConvexPointCloudShape::
|
||||
get_num_points() const {
|
||||
|
||||
return _shape->getNumPoints();
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
// Filename: bulletConvexPointCloudShape.cxx
|
||||
// Created by: enn0x (30Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletConvexPointCloudShape.h"
|
||||
|
||||
#include "geomVertexReader.h"
|
||||
|
||||
TypeHandle BulletConvexPointCloudShape::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConvexPointCloudShape::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletConvexPointCloudShape::
|
||||
BulletConvexPointCloudShape(const PTA_LVecBase3f &points, LVecBase3f scale) {
|
||||
|
||||
btVector3 btScale = LVecBase3f_to_btVector3(scale);
|
||||
|
||||
// Convert points
|
||||
btVector3 *btPoints = new btVector3[points.size()];
|
||||
|
||||
int i = 0;
|
||||
PTA_LVecBase3f::const_iterator it;
|
||||
for (it=points.begin(); it!=points.end(); it++) {
|
||||
btPoints[i] = LVecBase3f_to_btVector3(*it);
|
||||
i++;
|
||||
}
|
||||
|
||||
// Create shape
|
||||
_shape = new btConvexPointCloudShape(btPoints, points.size(), btScale);
|
||||
_shape->setUserPointer(this);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConvexPointCloudShape::ptr
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btCollisionShape *BulletConvexPointCloudShape::
|
||||
ptr() const {
|
||||
|
||||
return _shape;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletConvexPointCloudShape::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletConvexPointCloudShape::
|
||||
BulletConvexPointCloudShape(const Geom *geom, LVecBase3f scale) {
|
||||
|
||||
btVector3 btScale = LVecBase3f_to_btVector3(scale);
|
||||
|
||||
// Collect points
|
||||
pvector<LPoint3f> points;
|
||||
|
||||
CPT(GeomVertexData) vdata = geom->get_vertex_data();
|
||||
GeomVertexReader reader = GeomVertexReader(vdata, InternalName::get_vertex());
|
||||
|
||||
while (!reader.is_at_end()) {
|
||||
points.push_back(reader.get_data3f());
|
||||
}
|
||||
|
||||
// Convert points
|
||||
btVector3 *btPoints = new btVector3[points.size()];
|
||||
|
||||
int i = 0;
|
||||
pvector<LPoint3f>::const_iterator it;
|
||||
for (it=points.begin(); it!=points.end(); it++) {
|
||||
btPoints[i] = LVecBase3f_to_btVector3(*it);
|
||||
i++;
|
||||
}
|
||||
|
||||
// Create
|
||||
_shape = new btConvexPointCloudShape(btPoints, points.size(), btScale);
|
||||
_shape->setUserPointer(this);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
// Filename: bulletConvexPointCloudShape.h
|
||||
// Created by: enn0x (30Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_CONVEX_POINT_CLOUD_SHAPE_H__
|
||||
#define __BULLET_CONVEX_POINT_CLOUD_SHAPE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bulletShape.h"
|
||||
|
||||
#include "geom.h"
|
||||
#include "pta_LVecBase3f.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletConvexPointCloudShape
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletConvexPointCloudShape : public BulletShape {
|
||||
|
||||
PUBLISHED:
|
||||
BulletConvexPointCloudShape(const PTA_LVecBase3f &points, LVecBase3f scale=LVecBase3f(1.));
|
||||
BulletConvexPointCloudShape(const Geom *geom, LVecBase3f scale=LVecBase3f(1.));
|
||||
INLINE ~BulletConvexPointCloudShape();
|
||||
|
||||
INLINE int get_num_points() const;
|
||||
|
||||
public:
|
||||
virtual btCollisionShape *ptr() const;
|
||||
|
||||
private:
|
||||
btConvexPointCloudShape *_shape;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletShape::init_type();
|
||||
register_type(_type_handle, "BulletConvexPointCloudShape",
|
||||
BulletShape::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletConvexPointCloudShape.I"
|
||||
|
||||
#endif // __BULLET_CONVEX_POINT_CLOUD_SHAPE_H__
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
// Filename: bulletCylinderShape.I
|
||||
// Created by: enn0x (17Feb10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCylinderShape::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletCylinderShape::
|
||||
~BulletCylinderShape() {
|
||||
|
||||
delete _shape;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCylinderShape::get_radius
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletCylinderShape::
|
||||
get_radius() const {
|
||||
|
||||
return _shape->getRadius();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCylinderShape::get_half_extents_without_marging
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE LVecBase3f BulletCylinderShape::
|
||||
get_half_extents_without_marging() const {
|
||||
|
||||
return btVector3_to_LVecBase3f(_shape->getHalfExtentsWithoutMargin());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCylinderShape::get_half_extents_with_marging
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE LVecBase3f BulletCylinderShape::
|
||||
get_half_extents_with_marging() const {
|
||||
|
||||
return btVector3_to_LVecBase3f(_shape->getHalfExtentsWithMargin());
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
// Filename: bulletCylinderShape.cxx
|
||||
// Created by: enn0x (17Feb10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletCylinderShape.h"
|
||||
|
||||
TypeHandle BulletCylinderShape::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCylinderShape::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletCylinderShape::
|
||||
BulletCylinderShape(const LVector3f &half_extents, BulletUpAxis up) {
|
||||
|
||||
btVector3 btHalfExtents = LVecBase3f_to_btVector3(half_extents);
|
||||
|
||||
switch (up) {
|
||||
case X_up:
|
||||
_shape = new btCylinderShapeX(btHalfExtents);
|
||||
break;
|
||||
case Y_up:
|
||||
_shape = new btCylinderShape(btHalfExtents);
|
||||
break;
|
||||
case Z_up:
|
||||
_shape = new btCylinderShapeZ(btHalfExtents);
|
||||
break;
|
||||
default:
|
||||
bullet_cat.error() << "invalid up-axis:" << up << endl;
|
||||
break;
|
||||
}
|
||||
|
||||
_shape->setUserPointer(this);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCylinderShape::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletCylinderShape::
|
||||
BulletCylinderShape(float radius, float height, BulletUpAxis up) {
|
||||
|
||||
switch (up) {
|
||||
case X_up:
|
||||
_shape = new btCylinderShapeX(btVector3(0.5 * height, radius, 0.0f));
|
||||
break;
|
||||
case Y_up:
|
||||
_shape = new btCylinderShape(btVector3(radius, 0.5 * height, 0.0f));
|
||||
break;
|
||||
case Z_up:
|
||||
_shape = new btCylinderShapeZ(btVector3(radius, 0.0f, 0.5 * height));
|
||||
break;
|
||||
default:
|
||||
bullet_cat.error() << "invalid up-axis:" << up << endl;
|
||||
break;
|
||||
}
|
||||
|
||||
_shape->setUserPointer(this);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletCylinderShape::ptr
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btCollisionShape *BulletCylinderShape::
|
||||
ptr() const {
|
||||
|
||||
return _shape;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
// Filename: bulletCylinderShape.h
|
||||
// Created by: enn0x (17Feb10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_CYLINDER_SHAPE_H__
|
||||
#define __BULLET_CYLINDER_SHAPE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletShape.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletCylinderShape
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletCylinderShape : public BulletShape {
|
||||
|
||||
PUBLISHED:
|
||||
BulletCylinderShape(const LVector3f &half_extents, BulletUpAxis up=Z_up);
|
||||
BulletCylinderShape(float radius, float height, BulletUpAxis up=Z_up);
|
||||
INLINE ~BulletCylinderShape();
|
||||
|
||||
INLINE float get_radius() const;
|
||||
INLINE LVecBase3f get_half_extents_without_marging() const;
|
||||
INLINE LVecBase3f get_half_extents_with_marging() const;
|
||||
|
||||
public:
|
||||
virtual btCollisionShape *ptr() const;
|
||||
|
||||
private:
|
||||
btCylinderShape *_shape;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletShape::init_type();
|
||||
register_type(_type_handle, "BulletCylinderShape",
|
||||
BulletShape::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletCylinderShape.I"
|
||||
|
||||
#endif // __BULLET_CYLINDER_SHAPE_H__
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
// Filename: bulletDebugNode.I
|
||||
// Created by: enn0x (23Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletDebugNode::
|
||||
~BulletDebugNode() {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::set_verbose
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletDebugNode::
|
||||
set_verbose(bool verbose) {
|
||||
|
||||
_verbose = verbose;
|
||||
draw_mask_changed();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::get_verbose
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool BulletDebugNode::
|
||||
get_verbose() const {
|
||||
|
||||
return _verbose;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,392 @@
|
|||
// Filename: bulletDebugNode.cxx
|
||||
// Created by: enn0x (23Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletDebugNode.h"
|
||||
|
||||
#include "geomVertexFormat.h"
|
||||
#include "geomVertexWriter.h"
|
||||
|
||||
TypeHandle BulletDebugNode::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletDebugNode::
|
||||
BulletDebugNode(const char *name) : GeomNode(name), _verbose(false) {
|
||||
|
||||
set_overall_hidden(true);
|
||||
|
||||
_vdata = new GeomVertexData("", GeomVertexFormat::get_v3c4(), Geom::UH_stream);
|
||||
|
||||
// Lines
|
||||
_prim_lines = new GeomLines(Geom::UH_stream);
|
||||
_prim_lines->set_shade_model(Geom::SM_uniform);
|
||||
|
||||
_geom_lines = new Geom(_vdata);
|
||||
_geom_lines->add_primitive(_prim_lines);
|
||||
|
||||
add_geom(_geom_lines);
|
||||
|
||||
// Triangles
|
||||
_prim_triangles = new GeomTriangles(Geom::UH_stream);
|
||||
_prim_triangles->set_shade_model(Geom::SM_uniform);
|
||||
|
||||
_geom_triangles = new Geom(_vdata);
|
||||
_geom_triangles->add_primitive(_prim_triangles);
|
||||
|
||||
add_geom(_geom_triangles);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::safe_to_flatten
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is generally safe to flatten out
|
||||
// this particular kind of Node by duplicating
|
||||
// instances, false otherwise (for instance, a Camera
|
||||
// cannot be safely flattened, because the Camera
|
||||
// pointer itself is meaningful).
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletDebugNode::
|
||||
safe_to_flatten() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::safe_to_transform
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is generally safe to transform
|
||||
// this particular kind of Node by calling the xform()
|
||||
// method, false otherwise. For instance, it's usually
|
||||
// a bad idea to attempt to xform a Character.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletDebugNode::
|
||||
safe_to_transform() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::safe_to_modify_transform
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is safe to automatically adjust
|
||||
// the transform on this kind of node. Usually, this is
|
||||
// only a bad idea if the user expects to find a
|
||||
// particular transform on the node.
|
||||
//
|
||||
// ModelNodes with the preserve_transform flag set are
|
||||
// presently the only kinds of nodes that should not
|
||||
// have their transform even adjusted.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletDebugNode::
|
||||
safe_to_modify_transform() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::safe_to_combine
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is generally safe to combine this
|
||||
// particular kind of PandaNode with other kinds of
|
||||
// PandaNodes of compatible type, adding children or
|
||||
// whatever. For instance, an LODNode should not be
|
||||
// combined with any other PandaNode, because its set of
|
||||
// children is meaningful.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletDebugNode::
|
||||
safe_to_combine() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::safe_to_combine_children
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if it is generally safe to combine the
|
||||
// children of this PandaNode with each other. For
|
||||
// instance, an LODNode's children should not be
|
||||
// combined with each other, because the set of children
|
||||
// is meaningful.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletDebugNode::
|
||||
safe_to_combine_children() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::safe_to_flatten_below
|
||||
// Access: Public, Virtual
|
||||
// Description: Returns true if a flatten operation may safely
|
||||
// continue past this node, or false if nodes below this
|
||||
// node may not be molested.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletDebugNode::
|
||||
safe_to_flatten_below() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::draw_mask_changed
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletDebugNode::
|
||||
draw_mask_changed() {
|
||||
|
||||
if (is_overall_hidden()) {
|
||||
_drawer.setDebugMode(DebugDraw::DBG_NoDebug);
|
||||
}
|
||||
else {
|
||||
if (_verbose) {
|
||||
_drawer.setDebugMode(DebugDraw::DBG_DrawWireframe |
|
||||
DebugDraw::DBG_DrawAabb |
|
||||
DebugDraw::DBG_DrawContactPoints |
|
||||
DebugDraw::DBG_DrawConstraints |
|
||||
DebugDraw::DBG_DrawConstraintLimits);
|
||||
}
|
||||
else {
|
||||
_drawer.setDebugMode(DebugDraw::DBG_DrawWireframe |
|
||||
DebugDraw::DBG_DrawConstraints |
|
||||
DebugDraw::DBG_FastWireframe);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
DBG_DrawWireframe
|
||||
DBG_DrawAabb
|
||||
DBG_DrawText
|
||||
DBG_DrawFeaturesText
|
||||
DBG_DrawContactPoints
|
||||
DBG_DrawConstraints
|
||||
DBG_DrawConstraintLimits
|
||||
DBG_NoDeactivation
|
||||
DBG_NoHelpText
|
||||
DBG_EnableSatComparison
|
||||
DBG_DisableBulletLCP
|
||||
DBG_ProfileTimings
|
||||
DBG_EnableCCD
|
||||
DBG_FastWireframe
|
||||
*/
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::post_step
|
||||
// Access: Private
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletDebugNode::
|
||||
post_step(btDynamicsWorld *world) {
|
||||
|
||||
// Collect debug geometry data
|
||||
world->debugDrawWorld();
|
||||
|
||||
// Render collected data
|
||||
_prim_lines->clear_vertices();
|
||||
_prim_triangles->clear_vertices();
|
||||
|
||||
GeomVertexWriter vwriter(_vdata, InternalName::get_vertex());
|
||||
GeomVertexWriter cwriter(_vdata, InternalName::get_color());
|
||||
|
||||
int v = 0;
|
||||
|
||||
pvector<Line>::const_iterator lit;
|
||||
pvector<Triangle>::const_iterator tit;
|
||||
|
||||
for (lit = _drawer._lines.begin(); lit != _drawer._lines.end(); lit++) {
|
||||
Line line = *lit;
|
||||
|
||||
vwriter.add_data3f(line._p0);
|
||||
cwriter.add_data4f(line._color);
|
||||
vwriter.add_data3f(line._p1);
|
||||
cwriter.add_data4f(line._color);
|
||||
|
||||
_prim_lines->add_vertex(v++);
|
||||
_prim_lines->add_vertex(v++);
|
||||
|
||||
_prim_lines->close_primitive();
|
||||
}
|
||||
|
||||
for (tit = _drawer._triangles.begin(); tit != _drawer._triangles.end(); tit++) {
|
||||
Triangle tri = *tit;
|
||||
|
||||
vwriter.add_data3f(tri._p0);
|
||||
cwriter.add_data4f(tri._color);
|
||||
vwriter.add_data3f(tri._p1);
|
||||
cwriter.add_data4f(tri._color);
|
||||
vwriter.add_data3f(tri._p2);
|
||||
cwriter.add_data4f(tri._color);
|
||||
|
||||
_prim_triangles->add_vertex(v++);
|
||||
_prim_triangles->add_vertex(v++);
|
||||
_prim_triangles->add_vertex(v++);
|
||||
|
||||
_prim_triangles->close_primitive();
|
||||
}
|
||||
|
||||
// Clear the collected data again
|
||||
_drawer._lines.clear();
|
||||
_drawer._triangles.clear();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::DebugDraw::setDebugMode
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletDebugNode::DebugDraw::
|
||||
setDebugMode(int mode) {
|
||||
|
||||
_mode = mode;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::DebugDraw::getDebugMode
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
int BulletDebugNode::DebugDraw::
|
||||
getDebugMode() const {
|
||||
|
||||
return _mode;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::DebugDraw::reportErrorWarning
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletDebugNode::DebugDraw::
|
||||
reportErrorWarning(const char *warning) {
|
||||
|
||||
bullet_cat.error() << warning << endl;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::DebugDraw::drawLine
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletDebugNode::DebugDraw::
|
||||
drawLine(const btVector3 &from, const btVector3 &to, const btVector3 &color) {
|
||||
|
||||
float r = color.getX();
|
||||
float g = color.getY();
|
||||
float b = color.getZ();
|
||||
|
||||
Line line;
|
||||
|
||||
line._p0 = LVecBase3f(from.getX(), from.getY(), from.getZ());
|
||||
line._p1 = LVecBase3f(to.getX(), to.getY(), to.getZ());
|
||||
line._color = Colorf(r, g, b, 1.0f);
|
||||
|
||||
_lines.push_back(line);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::DebugDraw::drawTriangle
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletDebugNode::DebugDraw::
|
||||
drawTriangle(const btVector3 &v0, const btVector3 &v1, const btVector3 &v2, const btVector3 &color, btScalar) {
|
||||
|
||||
float r = color.getX();
|
||||
float g = color.getY();
|
||||
float b = color.getZ();
|
||||
|
||||
Triangle tri;
|
||||
|
||||
tri._p0 = LVecBase3f(v0.getX(), v0.getY(), v0.getZ());
|
||||
tri._p1 = LVecBase3f(v1.getX(), v1.getY(), v1.getZ());
|
||||
tri._p2 = LVecBase3f(v2.getX(), v2.getY(), v2.getZ());
|
||||
tri._color = Colorf(r, g, b, 1.0f);
|
||||
|
||||
_triangles.push_back(tri);
|
||||
|
||||
|
||||
// Draw the triangle's normal
|
||||
/*
|
||||
btVector3 x1 = v1 - v0;
|
||||
btVector3 x2 = v2 - v0;
|
||||
btVector3 normal = v1.cross(v2).normalize();
|
||||
|
||||
btVector3 from = (v0 + v1 + v2) * 0.3333;
|
||||
btVector3 to = from + normal;
|
||||
drawLine(from, to, color);
|
||||
*/
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::DebugDraw::drawTriangle
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletDebugNode::DebugDraw::
|
||||
drawTriangle(const btVector3 &v0, const btVector3 &v1, const btVector3 &v2, const btVector3 &n0, const btVector3 &n1, const btVector3 &n2, const btVector3 &color, btScalar alpha) {
|
||||
|
||||
// TODO
|
||||
bullet_cat.debug() << "drawTriangle(2) - not yet implemented!" << endl;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::DebugDraw::drawContactPoint
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletDebugNode::DebugDraw::
|
||||
drawContactPoint(const btVector3 &point, const btVector3 &normal, btScalar distance, int lifetime, const btVector3 &color) {
|
||||
|
||||
const btVector3 to = point + normal * distance;
|
||||
const btVector3 &from = point;
|
||||
|
||||
drawLine(from, to, color);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::DebugDraw::draw3dText
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletDebugNode::DebugDraw::
|
||||
draw3dText(const btVector3 &location, const char *text) {
|
||||
|
||||
// TODO
|
||||
bullet_cat.debug() << "draw3dText - not yet implemented!" << endl;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDebugNode::DebugDraw::drawSphere
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletDebugNode::DebugDraw::
|
||||
drawSphere(btScalar radius, const btTransform &transform, const btVector3 &color) {
|
||||
|
||||
btVector3 center = transform.getOrigin();
|
||||
|
||||
const btVector3 xoffs = transform.getBasis() * btVector3(1, 0, 0);
|
||||
const btVector3 yoffs = transform.getBasis() * btVector3(0, 1, 0);
|
||||
const btVector3 zoffs = transform.getBasis() * btVector3(0, 0, 1);
|
||||
|
||||
drawArc(center, xoffs, yoffs, radius, radius, 0, SIMD_2_PI, color, false, 10.0);
|
||||
drawArc(center, yoffs, zoffs, radius, radius, 0, SIMD_2_PI, color, false, 10.0);
|
||||
drawArc(center, zoffs, xoffs, radius, radius, 0, SIMD_2_PI, color, false, 10.0);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,135 @@
|
|||
// Filename: bulletDebugNode.h
|
||||
// Created by: enn0x (23Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_DEBUG_NODE_H__
|
||||
#define __BULLET_DEBUG_NODE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
|
||||
#include "geomNode.h"
|
||||
#include "geom.h"
|
||||
#include "geomVertexData.h"
|
||||
#include "geomLines.h"
|
||||
#include "geomTriangles.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletDebugNode
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletDebugNode : public GeomNode {
|
||||
|
||||
PUBLISHED:
|
||||
BulletDebugNode(const char *name="debug");
|
||||
INLINE ~BulletDebugNode();
|
||||
|
||||
virtual void draw_mask_changed();
|
||||
|
||||
INLINE void set_verbose(bool verbose);
|
||||
INLINE bool get_verbose() const;
|
||||
|
||||
public:
|
||||
virtual bool safe_to_flatten() const;
|
||||
virtual bool safe_to_transform() const;
|
||||
virtual bool safe_to_modify_transform() const;
|
||||
virtual bool safe_to_combine() const;
|
||||
virtual bool safe_to_combine_children() const;
|
||||
virtual bool safe_to_flatten_below() const;
|
||||
|
||||
private:
|
||||
void post_step(btDynamicsWorld *world);
|
||||
|
||||
struct Line {
|
||||
LVecBase3f _p0;
|
||||
LVecBase3f _p1;
|
||||
Colorf _color;
|
||||
};
|
||||
|
||||
struct Triangle {
|
||||
LVecBase3f _p0;
|
||||
LVecBase3f _p1;
|
||||
LVecBase3f _p2;
|
||||
Colorf _color;
|
||||
};
|
||||
|
||||
class DebugDraw : public btIDebugDraw {
|
||||
|
||||
public:
|
||||
DebugDraw() {};
|
||||
|
||||
virtual void setDebugMode(int mode);
|
||||
virtual int getDebugMode() const;
|
||||
virtual void reportErrorWarning(const char *warning);
|
||||
|
||||
virtual void drawLine(const btVector3 &from, const btVector3 &to,
|
||||
const btVector3 &color);
|
||||
virtual void drawContactPoint(const btVector3 &point,
|
||||
const btVector3 &normal, btScalar distance, int lifetime,
|
||||
const btVector3 &color);
|
||||
virtual void draw3dText(const btVector3 &location, const char *text);
|
||||
virtual void drawTriangle(const btVector3 &v0, const btVector3 &v1,
|
||||
const btVector3 &v2, const btVector3 &color, btScalar);
|
||||
virtual void drawTriangle(const btVector3 &v0, const btVector3 &v1,
|
||||
const btVector3 &v2, const btVector3 &n0, const btVector3 &n1,
|
||||
const btVector3 &n2, const btVector3 &color, btScalar alpha);
|
||||
virtual void drawSphere(btScalar radius, const btTransform &transform,
|
||||
const btVector3 &color);
|
||||
|
||||
public:
|
||||
pvector<Line> _lines;
|
||||
pvector<Triangle> _triangles;
|
||||
|
||||
private:
|
||||
int _mode;
|
||||
};
|
||||
|
||||
DebugDraw _drawer;
|
||||
|
||||
bool _verbose;
|
||||
|
||||
PT(GeomVertexData) _vdata;
|
||||
PT(Geom) _geom_lines;
|
||||
PT(GeomLines) _prim_lines;
|
||||
PT(Geom) _geom_triangles;
|
||||
PT(GeomTriangles) _prim_triangles;
|
||||
|
||||
friend class BulletWorld;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
PandaNode::init_type();
|
||||
register_type(_type_handle, "BulletDebugNode",
|
||||
PandaNode::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletDebugNode.I"
|
||||
|
||||
#endif // __BULLET_DEBUG_NODE_H__
|
||||
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
// Filename: bulletDistanceConstraint.I
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDistanceConstraint::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletDistanceConstraint::
|
||||
~BulletDistanceConstraint() {
|
||||
|
||||
delete _constraint;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,111 @@
|
|||
// Filename: bulletDistanceConstraint.cxx
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletDistanceConstraint.h"
|
||||
#include "bulletRigidBodyNode.h"
|
||||
|
||||
TypeHandle BulletDistanceConstraint::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDistanceConstraint::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletDistanceConstraint::
|
||||
BulletDistanceConstraint(const BulletRigidBodyNode *node_a,
|
||||
const LPoint3f &pivot_a) {
|
||||
|
||||
btRigidBody *ptr_a = btRigidBody::upcast(node_a->get_object());
|
||||
btVector3 pos_a = LVecBase3f_to_btVector3(pivot_a);
|
||||
|
||||
_constraint = new btPoint2PointConstraint(*ptr_a, pos_a);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDistanceConstraint::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletDistanceConstraint::
|
||||
BulletDistanceConstraint(const BulletRigidBodyNode *node_a,
|
||||
const BulletRigidBodyNode *node_b,
|
||||
const LPoint3f &pivot_a,
|
||||
const LPoint3f &pivot_b) {
|
||||
|
||||
btRigidBody *ptr_a = btRigidBody::upcast(node_a->get_object());
|
||||
btVector3 pos_a = LVecBase3f_to_btVector3(pivot_a);
|
||||
|
||||
btRigidBody *ptr_b = btRigidBody::upcast(node_b->get_object());
|
||||
btVector3 pos_b = LVecBase3f_to_btVector3(pivot_b);
|
||||
|
||||
_constraint = new btPoint2PointConstraint(*ptr_a, *ptr_b, pos_a, pos_b);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDistanceConstraint::ptr
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btTypedConstraint *BulletDistanceConstraint::
|
||||
ptr() const {
|
||||
|
||||
return _constraint;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDistanceConstraint::set_pivot_a
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletDistanceConstraint::
|
||||
set_pivot_a(const LPoint3f &pivot_a) {
|
||||
|
||||
nassertv(!pivot_a.is_nan());
|
||||
_constraint->setPivotA(LVecBase3f_to_btVector3(pivot_a));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDistanceConstraint::set_pivot_b
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletDistanceConstraint::
|
||||
set_pivot_b(const LPoint3f &pivot_b) {
|
||||
|
||||
nassertv(!pivot_b.is_nan());
|
||||
_constraint->setPivotA(LVecBase3f_to_btVector3(pivot_b));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDistanceConstraint::set_pivot_in_a
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletDistanceConstraint::
|
||||
get_pivot_in_a() const {
|
||||
|
||||
return btVector3_to_LPoint3f(_constraint->getPivotInA());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletDistanceConstraint::set_pivot_in_b
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletDistanceConstraint::
|
||||
get_pivot_in_b() const {
|
||||
|
||||
return btVector3_to_LPoint3f(_constraint->getPivotInB());
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
// Filename: bulletDistanceConstraint.h
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_DISTANCE_CONSTRAINT_H__
|
||||
#define __BULLET_DISTANCE_CONSTRAINT_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletConstraint.h"
|
||||
|
||||
#include "lpoint3.h"
|
||||
|
||||
class BulletRigidBodyNode;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletDistanceConstraint
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletDistanceConstraint : public BulletConstraint {
|
||||
|
||||
PUBLISHED:
|
||||
BulletDistanceConstraint(const BulletRigidBodyNode *node_a,
|
||||
const LPoint3f &pivot_a);
|
||||
BulletDistanceConstraint(const BulletRigidBodyNode *node_a,
|
||||
const BulletRigidBodyNode *node_b,
|
||||
const LPoint3f &pivot_a,
|
||||
const LPoint3f &pivot_b);
|
||||
INLINE ~BulletDistanceConstraint();
|
||||
|
||||
void set_pivot_a(const LPoint3f &pivot_a);
|
||||
void set_pivot_b(const LPoint3f &pivot_b);
|
||||
|
||||
LPoint3f get_pivot_in_a() const;
|
||||
LPoint3f get_pivot_in_b() const;
|
||||
|
||||
public:
|
||||
virtual btTypedConstraint *ptr() const;
|
||||
|
||||
private:
|
||||
btPoint2PointConstraint *_constraint;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletConstraint::init_type();
|
||||
register_type(_type_handle, "BulletDistanceConstraint",
|
||||
BulletConstraint::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletDistanceConstraint.I"
|
||||
|
||||
#endif // __BULLET_DISTANCE_CONSTRAINT_H__
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
// Filename: bulletGenericConstraint.I
|
||||
// Created by: enn0x (02Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGenericConstraint::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletGenericConstraint::
|
||||
~BulletGenericConstraint() {
|
||||
|
||||
delete _constraint;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,115 @@
|
|||
// Filename: bulletGenericConstraint.cxx
|
||||
// Created by: enn0x (02Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletGenericConstraint.h"
|
||||
#include "bulletRigidBodyNode.h"
|
||||
|
||||
TypeHandle BulletGenericConstraint::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGenericConstraint::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletGenericConstraint::
|
||||
BulletGenericConstraint(const BulletRigidBodyNode *node_a,
|
||||
const TransformState &frame_a,
|
||||
bool use_frame_a) {
|
||||
|
||||
btRigidBody *ptr_a = btRigidBody::upcast(node_a->get_object());
|
||||
btTransform trans_a = LMatrix4f_to_btTrans(frame_a.get_mat());
|
||||
|
||||
_constraint = new btGeneric6DofConstraint(*ptr_a, trans_a, use_frame_a);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGenericConstraint::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletGenericConstraint::
|
||||
BulletGenericConstraint(const BulletRigidBodyNode *node_a,
|
||||
const BulletRigidBodyNode *node_b,
|
||||
const TransformState &frame_a,
|
||||
const TransformState &frame_b,
|
||||
bool use_frame_a) {
|
||||
|
||||
btRigidBody *ptr_a = btRigidBody::upcast(node_a->get_object());
|
||||
btTransform trans_a = LMatrix4f_to_btTrans(frame_a.get_mat());
|
||||
|
||||
btRigidBody *ptr_b = btRigidBody::upcast(node_b->get_object());
|
||||
btTransform trans_b = LMatrix4f_to_btTrans(frame_b.get_mat());
|
||||
|
||||
_constraint = new btGeneric6DofConstraint(*ptr_a, *ptr_b, trans_a, trans_b, use_frame_a);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGenericConstraint::ptr
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btTypedConstraint *BulletGenericConstraint::
|
||||
ptr() const {
|
||||
|
||||
return _constraint;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGenericConstraint::set_linear_lower_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletGenericConstraint::
|
||||
set_linear_lower_limit(const LPoint3f &limit) {
|
||||
|
||||
nassertv(!limit.is_nan());
|
||||
_constraint->setLinearLowerLimit(LVecBase3f_to_btVector3(limit));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGenericConstraint::set_linear_upper_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletGenericConstraint::
|
||||
set_linear_upper_limit(const LPoint3f &limit) {
|
||||
|
||||
nassertv(!limit.is_nan());
|
||||
_constraint->setLinearUpperLimit(LVecBase3f_to_btVector3(limit));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGenericConstraint::set_angular_lower_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletGenericConstraint::
|
||||
set_angular_lower_limit(const LVector3f &limit) {
|
||||
|
||||
nassertv(!limit.is_nan());
|
||||
_constraint->setAngularLowerLimit(LVecBase3f_to_btVector3(limit));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGenericConstraint::set_angular_upper_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletGenericConstraint::
|
||||
set_angular_upper_limit(const LVector3f &limit) {
|
||||
|
||||
nassertv(!limit.is_nan());
|
||||
_constraint->setAngularUpperLimit(LVecBase3f_to_btVector3(limit));
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
// Filename: bulletGenericConstraint.h
|
||||
// Created by: enn0x (02Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_GENERIC_CONSTRAINT_H__
|
||||
#define __BULLET_GENERIC_CONSTRAINT_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletConstraint.h"
|
||||
|
||||
#include "transformState.h"
|
||||
#include "lpoint3.h"
|
||||
#include "lvector3.h"
|
||||
|
||||
class BulletRigidBodyNode;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletGenericConstraint
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletGenericConstraint : public BulletConstraint {
|
||||
|
||||
PUBLISHED:
|
||||
BulletGenericConstraint(const BulletRigidBodyNode *node_a,
|
||||
const TransformState &frame_a,
|
||||
bool use_frame_a);
|
||||
BulletGenericConstraint(const BulletRigidBodyNode *node_a,
|
||||
const BulletRigidBodyNode *node_b,
|
||||
const TransformState &frame_a,
|
||||
const TransformState &frame_b,
|
||||
bool use_frame_a);
|
||||
INLINE ~BulletGenericConstraint();
|
||||
|
||||
void set_linear_lower_limit(const LPoint3f &limit);
|
||||
void set_linear_upper_limit(const LPoint3f &limit);
|
||||
void set_angular_lower_limit(const LVector3f &limit);
|
||||
void set_angular_upper_limit(const LVector3f &limit);
|
||||
|
||||
public:
|
||||
virtual btTypedConstraint *ptr() const;
|
||||
|
||||
private:
|
||||
btGeneric6DofConstraint *_constraint;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletConstraint::init_type();
|
||||
register_type(_type_handle, "BulletGenericConstraint",
|
||||
BulletConstraint::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletGenericConstraint.I"
|
||||
|
||||
#endif // __BULLET_GENERIC_CONSTRAINT_H__
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
// Filename: bulletGhostNode.I
|
||||
// Created by: enn0x (19Nov10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGhostNode::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletGhostNode::
|
||||
~BulletGhostNode() {
|
||||
|
||||
delete _ghost;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGhostNode::get_num_overlapping_nodes
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE int BulletGhostNode::
|
||||
get_num_overlapping_nodes() const {
|
||||
|
||||
return _ghost->getNumOverlappingObjects();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGhostNode::get_overlapping_node
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE PandaNode *BulletGhostNode::
|
||||
get_overlapping_node(int idx) const {
|
||||
|
||||
nassertr(idx >=0 && idx < _ghost->getNumOverlappingObjects(), NULL);
|
||||
|
||||
btCollisionObject *object = _ghost->getOverlappingObject(idx);
|
||||
return (object) ? (PandaNode *)object->getUserPointer() : NULL;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,113 @@
|
|||
// Filename: bulletGhostNode.cxx
|
||||
// Created by: enn0x (19Nov10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletGhostNode.h"
|
||||
#include "bulletShape.h"
|
||||
|
||||
TypeHandle BulletGhostNode::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGhostNode::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletGhostNode::
|
||||
BulletGhostNode(const char *name) : BulletBodyNode(name) {
|
||||
|
||||
// Setup initial transform
|
||||
btTransform trans = btTransform::getIdentity();
|
||||
|
||||
// Setup ghost object
|
||||
_ghost = new btPairCachingGhostObject();
|
||||
_ghost->setUserPointer(this);
|
||||
_ghost->setCollisionFlags(btCollisionObject::CF_NO_CONTACT_RESPONSE);
|
||||
_ghost->setWorldTransform(trans);
|
||||
_ghost->setInterpolationWorldTransform(trans);
|
||||
_ghost->setCollisionShape(_shape);
|
||||
|
||||
// Autosync is off by default
|
||||
_sync_transform = false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGhostNode::get_object
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btCollisionObject *BulletGhostNode::
|
||||
get_object() const {
|
||||
|
||||
return _ghost;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGhostNode::parents_changed
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletGhostNode::
|
||||
parents_changed() {
|
||||
|
||||
// Enable autosync if one of the parents is suited for this
|
||||
Parents parents = get_parents();
|
||||
for (int i=0; i < parents.get_num_parents(); ++i) {
|
||||
PandaNode *parent = parents.get_parent(i);
|
||||
TypeHandle type = parent->get_type();
|
||||
|
||||
if (BulletRigidBodyNode::get_class_type() == type ||
|
||||
BulletSoftBodyNode::get_class_type() == type ||
|
||||
BulletGhostNode::get_class_type() == type ||
|
||||
BulletCharacterControllerNode::get_class_type() == type) {
|
||||
_sync_transform = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// None of the parents is suited for autosync
|
||||
_sync_transform = false;
|
||||
|
||||
transform_changed();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGhostNode::transform_changed
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletGhostNode::
|
||||
transform_changed() {
|
||||
|
||||
if (_disable_transform_changed) return;
|
||||
|
||||
btTransform trans;
|
||||
get_node_transform(trans, this);
|
||||
_ghost->setWorldTransform(trans);
|
||||
_ghost->setInterpolationWorldTransform(trans);
|
||||
|
||||
BulletBodyNode::transform_changed();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletGhostNode::pre_step
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletGhostNode::
|
||||
pre_step() {
|
||||
|
||||
if (_sync_transform) {
|
||||
transform_changed();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
// Filename: bulletGhostNode.h
|
||||
// Created by: enn0x (19Nov10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_GHOST_NODE_H__
|
||||
#define __BULLET_GHOST_NODE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletBodyNode.h"
|
||||
|
||||
#include "pandaNode.h"
|
||||
#include "collideMask.h"
|
||||
|
||||
class BulletShape;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletGhostNode
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletGhostNode : public BulletBodyNode {
|
||||
|
||||
PUBLISHED:
|
||||
BulletGhostNode(const char *name="ghost");
|
||||
INLINE ~BulletGhostNode();
|
||||
|
||||
// Overlapping
|
||||
INLINE int get_num_overlapping_nodes() const;
|
||||
INLINE PandaNode *get_overlapping_node(int idx) const;
|
||||
MAKE_SEQ(get_overlapping_nodes, get_num_overlapping_nodes, get_overlapping_node);
|
||||
|
||||
public:
|
||||
virtual btCollisionObject *get_object() const;
|
||||
|
||||
void pre_step();
|
||||
|
||||
protected:
|
||||
virtual void parents_changed();
|
||||
virtual void transform_changed();
|
||||
|
||||
private:
|
||||
btPairCachingGhostObject *_ghost;
|
||||
|
||||
bool _sync_transform;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletBodyNode::init_type();
|
||||
register_type(_type_handle, "BulletGhostNode",
|
||||
BulletBodyNode::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletGhostNode.I"
|
||||
|
||||
#endif // __BULLET_GHOST_NODE_H__
|
||||
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
// Filename: bulletHeightfieldShape.I
|
||||
// Created by: enn0x (05Feb10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHeightfieldShape::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletHeightfieldShape::
|
||||
~BulletHeightfieldShape() {
|
||||
|
||||
delete _shape;
|
||||
delete _data;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
// Filename: bulletHeightfieldShape.cxx
|
||||
// Created by: enn0x (05Feb10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletHeightfieldShape.h"
|
||||
|
||||
TypeHandle BulletHeightfieldShape::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHeightfieldShape::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletHeightfieldShape::
|
||||
BulletHeightfieldShape(const PNMImage &image, float max_height, BulletUpAxis up) {
|
||||
|
||||
int num_rows = image.get_x_size();
|
||||
int num_columns = image.get_y_size();
|
||||
|
||||
_data = new float[num_rows * num_columns];
|
||||
|
||||
for (int row=0; row < num_rows; row++) {
|
||||
for (int column=0; column < num_columns; column++) {
|
||||
_data[num_columns * row + column] =
|
||||
max_height * image.get_bright(column, num_columns - row - 1);
|
||||
}
|
||||
}
|
||||
|
||||
_shape = new btHeightfieldTerrainShape(num_rows, num_columns,
|
||||
_data,
|
||||
max_height,
|
||||
up,
|
||||
true, false);
|
||||
_shape->setUserPointer(this);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHeightfieldShape::ptr
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btCollisionShape *BulletHeightfieldShape::
|
||||
ptr() const {
|
||||
|
||||
return _shape;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHeightfieldShape::set_use_diamond_subdivision
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletHeightfieldShape::
|
||||
set_use_diamond_subdivision(bool flag) {
|
||||
|
||||
return _shape->setUseDiamondSubdivision(flag);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
// Filename: bulletHeightfieldShape.h
|
||||
// Created by: enn0x (05Feb10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_HEIGHTFIELD_SHAPE_H__
|
||||
#define __BULLET_HEIGHTFIELD_SHAPE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletShape.h"
|
||||
|
||||
#include "pnmImage.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletHeightfieldShape
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletHeightfieldShape : public BulletShape {
|
||||
|
||||
PUBLISHED:
|
||||
BulletHeightfieldShape(const PNMImage &image, float max_height, BulletUpAxis up=Z_up);
|
||||
INLINE ~BulletHeightfieldShape();
|
||||
|
||||
void set_use_diamond_subdivision(bool flag=true);
|
||||
|
||||
public:
|
||||
virtual btCollisionShape *ptr() const;
|
||||
|
||||
private:
|
||||
float *_data;
|
||||
btHeightfieldTerrainShape *_shape;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletShape::init_type();
|
||||
register_type(_type_handle, "BulletHeightfieldShape",
|
||||
BulletShape::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletHeightfieldShape.I"
|
||||
|
||||
#endif // __BULLET_HEIGHTFIELD_SHAPE_H__
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
// Filename: bulletHelper.I
|
||||
// Created by: enn0x (19Jan11)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHelper::get_sb_index
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE PT(InternalName) BulletHelper::
|
||||
get_sb_index() {
|
||||
|
||||
if (_sb_index == (InternalName *)NULL) {
|
||||
_sb_index = InternalName::make("sb_index");
|
||||
}
|
||||
return _sb_index;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHelper::get_sb_flip
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE PT(InternalName) BulletHelper::
|
||||
get_sb_flip() {
|
||||
|
||||
if (_sb_flip == (InternalName *)NULL) {
|
||||
_sb_flip = InternalName::make("sb_flip");
|
||||
}
|
||||
return _sb_flip;
|
||||
}
|
||||
|
|
@ -0,0 +1,307 @@
|
|||
// Filename: bulletHelper.cxx
|
||||
// Created by: enn0x (19Jan11)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletHelper.h"
|
||||
#include "bulletRigidBodyNode.h"
|
||||
#include "bulletGhostNode.h"
|
||||
|
||||
#include "geomVertexRewriter.h"
|
||||
|
||||
PT(InternalName) BulletHelper::_sb_index;
|
||||
PT(InternalName) BulletHelper::_sb_flip;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHelper::from_collision_solids
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
NodePathCollection BulletHelper::
|
||||
from_collision_solids(NodePath &np, bool clear) {
|
||||
|
||||
NodePathCollection result;
|
||||
|
||||
// Iterate over all CollisionNodes below the given node
|
||||
NodePathCollection npc = np.find_all_matches( "**/+CollisionNode" );
|
||||
|
||||
for (int i=0; i<npc.get_num_paths(); i++) {
|
||||
NodePath cnp = npc.get_path(i);
|
||||
CollisionNode *cnode = DCAST(CollisionNode, cnp.node());
|
||||
|
||||
PT(PandaNode) bnode = NULL;
|
||||
|
||||
// Create a either a new rigid body or a new ghost for each CollisionNode,
|
||||
// and add one shape per CollisionSolid contained in the CollisionNode
|
||||
if (is_tangible(cnode)) {
|
||||
PT(BulletRigidBodyNode) body;
|
||||
|
||||
body = new BulletRigidBodyNode();
|
||||
body->add_shapes_from_collision_solids(cnode);
|
||||
body->set_transform(cnp.get_transform(np));
|
||||
body->set_into_collide_mask(cnode->get_into_collide_mask());
|
||||
body->set_mass(0.0f);
|
||||
body->set_name(cnode->get_name());
|
||||
|
||||
bnode = body;
|
||||
}
|
||||
else {
|
||||
PT(BulletGhostNode) ghost;
|
||||
|
||||
ghost = new BulletGhostNode();
|
||||
ghost->add_shapes_from_collision_solids(cnode);
|
||||
ghost->set_transform(cnp.get_transform(np));
|
||||
ghost->set_into_collide_mask(cnode->get_into_collide_mask());
|
||||
ghost->set_name(cnode->get_name());
|
||||
|
||||
bnode = ghost;
|
||||
}
|
||||
|
||||
// Remove collision node if requested
|
||||
if (clear) {
|
||||
cnp.remove_node();
|
||||
}
|
||||
|
||||
result.add_path(NodePath::any_path(bnode));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHelper::is_tangible
|
||||
// Access: Private
|
||||
// Description: Returns TRUE if at least one CollisionSolid of
|
||||
// the given CollisionNode is tangible. Returns FALSE
|
||||
// if all CollisionSolids are intangible.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletHelper::
|
||||
is_tangible(CollisionNode *cnode) {
|
||||
|
||||
for (int j=0; j<cnode->get_num_solids(); j++) {
|
||||
CPT(CollisionSolid) solid = cnode->get_solid(j);
|
||||
if (solid->is_tangible()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHelper::add_sb_index_column
|
||||
// Access: Private
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
CPT(GeomVertexFormat) BulletHelper::
|
||||
add_sb_index_column(const GeomVertexFormat *format) {
|
||||
|
||||
PT(InternalName) name = BulletHelper::get_sb_index();
|
||||
|
||||
if (format->has_column(name)) return format;
|
||||
|
||||
PT(GeomVertexArrayFormat) array;
|
||||
PT(GeomVertexFormat) unregistered_format;
|
||||
CPT(GeomVertexFormat) registered_format;
|
||||
|
||||
array = new GeomVertexArrayFormat();
|
||||
array->add_column(name, 1, Geom::NT_uint16, Geom::C_index);
|
||||
|
||||
unregistered_format = new GeomVertexFormat(*format);
|
||||
unregistered_format->add_array(array);
|
||||
|
||||
registered_format = GeomVertexFormat::register_format(unregistered_format);
|
||||
|
||||
return registered_format;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHelper::add_sb_flip_column
|
||||
// Access: Private
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
CPT(GeomVertexFormat) BulletHelper::
|
||||
add_sb_flip_column(const GeomVertexFormat *format) {
|
||||
|
||||
PT(InternalName) name = BulletHelper::get_sb_flip();
|
||||
|
||||
if (format->has_column(name)) return format;
|
||||
|
||||
PT(GeomVertexArrayFormat) array;
|
||||
PT(GeomVertexFormat) unregistered_format;
|
||||
CPT(GeomVertexFormat) registered_format;
|
||||
|
||||
array = new GeomVertexArrayFormat();
|
||||
array->add_column(name, 1, Geom::NT_uint8, Geom::C_other);
|
||||
|
||||
unregistered_format = new GeomVertexFormat(*format);
|
||||
unregistered_format->add_array(array);
|
||||
|
||||
registered_format = GeomVertexFormat::register_format(unregistered_format);
|
||||
|
||||
return registered_format;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHelper::make_geom_from_faces
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
PT(Geom) BulletHelper::
|
||||
make_geom_from_faces(BulletSoftBodyNode *node, const GeomVertexFormat *format, bool two_sided) {
|
||||
|
||||
return make_geom(node, format, two_sided, true);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHelper::make_geom_from_links
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
PT(Geom) BulletHelper::
|
||||
make_geom_from_links(BulletSoftBodyNode *node, const GeomVertexFormat *format) {
|
||||
|
||||
return make_geom(node, format, false, false);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHelper::make_geom
|
||||
// Access: Private
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
PT(Geom) BulletHelper::
|
||||
make_geom(BulletSoftBodyNode *node, const GeomVertexFormat *format, bool two_sided, bool use_faces) {
|
||||
|
||||
btTransform trans;
|
||||
get_node_transform(trans, node);
|
||||
|
||||
btSoftBody *body = (btSoftBody *)node->get_object();
|
||||
|
||||
PT(Geom) geom;
|
||||
PT(GeomPrimitive) prim;
|
||||
PT(GeomVertexData) vdata;
|
||||
|
||||
CPT(GeomVertexFormat) fmt = (format) ? format : GeomVertexFormat::get_v3n3t2();
|
||||
fmt = BulletHelper::add_sb_flip_column(fmt);
|
||||
|
||||
nassertr(fmt->has_column(InternalName::get_vertex()), NULL);
|
||||
nassertr(fmt->has_column(InternalName::get_normal()), NULL);
|
||||
|
||||
btSoftBody::tNodeArray &nodes(body->m_nodes);
|
||||
|
||||
// Vertex data
|
||||
vdata = new GeomVertexData("", fmt, Geom::UH_stream);
|
||||
|
||||
GeomVertexWriter vwriter(vdata, InternalName::get_vertex());
|
||||
GeomVertexWriter nwriter(vdata, InternalName::get_normal());
|
||||
GeomVertexWriter fwriter(vdata, BulletHelper::get_sb_flip());
|
||||
|
||||
for (int j=0; j<nodes.size(); ++j) {
|
||||
btVector3 v = nodes[j].m_x;
|
||||
btVector3 &n = nodes[j].m_n;
|
||||
|
||||
v = trans.invXform(v);
|
||||
|
||||
vwriter.add_data3f(v.getX(), v.getY(), v.getZ());
|
||||
nwriter.add_data3f(n.getX(), n.getY(), n.getZ());
|
||||
fwriter.add_data1i(0);
|
||||
}
|
||||
|
||||
if (two_sided) {
|
||||
for (int j=0; j<nodes.size(); ++j) {
|
||||
btVector3 &v = nodes[j].m_x;
|
||||
btVector3 &n = nodes[j].m_n;
|
||||
|
||||
vwriter.add_data3f(v.getX(), v.getY(), v.getZ());
|
||||
nwriter.add_data3f(n.getX(), n.getY(), n.getZ());
|
||||
fwriter.add_data1i(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Indices
|
||||
btSoftBody::Node *node0 = &nodes[0];
|
||||
|
||||
if (use_faces) {
|
||||
btSoftBody::tFaceArray &faces(body->m_faces);
|
||||
|
||||
prim = new GeomTriangles(Geom::UH_stream);
|
||||
prim->set_shade_model(Geom::SM_uniform);
|
||||
|
||||
for (int j=0; j<faces.size(); ++j) {
|
||||
prim->add_vertices(int(faces[j].m_n[0] - node0),
|
||||
int(faces[j].m_n[1] - node0),
|
||||
int(faces[j].m_n[2] - node0));
|
||||
prim->close_primitive();
|
||||
|
||||
if (two_sided) {
|
||||
prim->add_vertices(nodes.size() + int(faces[j].m_n[0] - node0),
|
||||
nodes.size() + int(faces[j].m_n[2] - node0),
|
||||
nodes.size() + int(faces[j].m_n[1] - node0));
|
||||
prim->close_primitive();
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
btSoftBody::tLinkArray &links(body->m_links);
|
||||
|
||||
prim = new GeomLines(Geom::UH_stream);
|
||||
prim->set_shade_model(Geom::SM_uniform);
|
||||
|
||||
for (int j=0; j<links.size(); ++j) {
|
||||
prim->add_vertices(int(links[j].m_n[0] - node0),
|
||||
int(links[j].m_n[1] - node0));
|
||||
prim->close_primitive();
|
||||
}
|
||||
}
|
||||
|
||||
// Geom
|
||||
geom = new Geom(vdata);
|
||||
geom->add_primitive(prim);
|
||||
|
||||
return geom;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHelper::make_texcoords_for_patch
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletHelper::
|
||||
make_texcoords_for_patch(Geom *geom, int resx, int resy) {
|
||||
|
||||
PT(GeomVertexData) vdata = geom->modify_vertex_data();
|
||||
|
||||
nassertv(vdata->has_column(InternalName::get_texcoord()));
|
||||
|
||||
GeomVertexRewriter texcoords(vdata, InternalName::get_texcoord());
|
||||
|
||||
int n = resx * resy;
|
||||
int i = 0;
|
||||
int ix;
|
||||
int iy;
|
||||
float u;
|
||||
float v;
|
||||
|
||||
while (!texcoords.is_at_end()) {
|
||||
ix = i / resx;
|
||||
iy = i % resy;
|
||||
|
||||
if (i > n) ix -= 1;
|
||||
|
||||
u = (float)ix/(float)(resx - 1);
|
||||
v = (float)iy/(float)(resy - 1);
|
||||
|
||||
texcoords.set_data2f(u, v);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
// Filename: bulletHelper.h
|
||||
// Created by: enn0x (19Jan11)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_HELPER_H__
|
||||
#define __BULLET_HELPER_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
|
||||
#include "collisionNode.h"
|
||||
#include "nodePath.h"
|
||||
#include "nodePathCollection.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletHelper
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletHelper {
|
||||
|
||||
PUBLISHED:
|
||||
|
||||
// Collision shapes
|
||||
static NodePathCollection from_collision_solids(NodePath &np, bool clear=false);
|
||||
|
||||
// Internal names
|
||||
INLINE static PT(InternalName) get_sb_index();
|
||||
INLINE static PT(InternalName) get_sb_flip();
|
||||
|
||||
// Geom vertex data
|
||||
static CPT(GeomVertexFormat) add_sb_index_column(const GeomVertexFormat *format);
|
||||
static CPT(GeomVertexFormat) add_sb_flip_column(const GeomVertexFormat *format);
|
||||
|
||||
// Geom utils
|
||||
static PT(Geom) make_geom_from_faces(BulletSoftBodyNode *node,
|
||||
const GeomVertexFormat *format=NULL,
|
||||
bool two_sided=false);
|
||||
|
||||
static PT(Geom) make_geom_from_links(BulletSoftBodyNode *node,
|
||||
const GeomVertexFormat *format=NULL);
|
||||
|
||||
static void make_texcoords_for_patch(Geom *geom, int resx, int resy);
|
||||
|
||||
private:
|
||||
static PT(InternalName) _sb_index;
|
||||
static PT(InternalName) _sb_flip;
|
||||
|
||||
static bool is_tangible(CollisionNode *cnode);
|
||||
|
||||
static PT(Geom) make_geom(BulletSoftBodyNode *node,
|
||||
const GeomVertexFormat *format,
|
||||
bool use_faces,
|
||||
bool two_sided);
|
||||
};
|
||||
|
||||
#include "bulletHelper.I"
|
||||
|
||||
#endif // __BULLET_HELPER_H__
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
// Filename: bulletHingeConstraint.I
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHingeConstraint::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletHingeConstraint::
|
||||
~BulletHingeConstraint() {
|
||||
|
||||
delete _constraint;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,158 @@
|
|||
// Filename: bulletHingeConstraint.cxx
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletHingeConstraint.h"
|
||||
#include "bulletRigidBodyNode.h"
|
||||
|
||||
#include "deg_2_rad.h"
|
||||
|
||||
TypeHandle BulletHingeConstraint::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHingeConstraint::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletHingeConstraint::
|
||||
BulletHingeConstraint(const BulletRigidBodyNode *node_a,
|
||||
const LPoint3f &pivot_a,
|
||||
const LVector3f &axis_a,
|
||||
bool use_frame_a) {
|
||||
|
||||
btRigidBody *ptr_a = btRigidBody::upcast(node_a->get_object());
|
||||
btVector3 pos_a = LVecBase3f_to_btVector3(pivot_a);
|
||||
btVector3 vec_a = LVecBase3f_to_btVector3(axis_a);
|
||||
|
||||
_constraint = new btHingeConstraint(*ptr_a, pos_a, vec_a, use_frame_a);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHingeConstraint::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletHingeConstraint::
|
||||
BulletHingeConstraint(const BulletRigidBodyNode *node_a,
|
||||
const BulletRigidBodyNode *node_b,
|
||||
const LPoint3f &pivot_a,
|
||||
const LPoint3f &pivot_b,
|
||||
const LVector3f &axis_a,
|
||||
const LVector3f &axis_b,
|
||||
bool use_frame_a) {
|
||||
|
||||
btRigidBody *ptr_a = btRigidBody::upcast(node_a->get_object());
|
||||
btVector3 pos_a = LVecBase3f_to_btVector3(pivot_a);
|
||||
btVector3 vec_a = LVecBase3f_to_btVector3(axis_a);
|
||||
|
||||
btRigidBody *ptr_b = btRigidBody::upcast(node_b->get_object());
|
||||
btVector3 pos_b = LVecBase3f_to_btVector3(pivot_b);
|
||||
btVector3 vec_b = LVecBase3f_to_btVector3(axis_b);
|
||||
|
||||
_constraint = new btHingeConstraint(*ptr_a, *ptr_b, pos_a, pos_b, vec_a, vec_b, use_frame_a);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHingeConstraint::ptr
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btTypedConstraint *BulletHingeConstraint::
|
||||
ptr() const {
|
||||
|
||||
return _constraint;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHingeConstraint::set_angular_only
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletHingeConstraint::
|
||||
set_angular_only(bool value) {
|
||||
|
||||
return _constraint->setAngularOnly(value);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHingeConstraint::get_angular_only
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletHingeConstraint::
|
||||
get_angular_only() const {
|
||||
|
||||
return _constraint->getAngularOnly();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHingeConstraint::set_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletHingeConstraint::
|
||||
set_limit(float low, float high, float softness, float bias, float relaxation) {
|
||||
|
||||
low = deg_2_rad(low);
|
||||
high = deg_2_rad(high);
|
||||
|
||||
_constraint->setLimit(low, high, softness, bias, relaxation);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHingeConstraint::set_axis
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletHingeConstraint::
|
||||
set_axis(const LVector3f &axis) {
|
||||
|
||||
nassertv(!axis.is_nan());
|
||||
|
||||
btVector3 v = LVecBase3f_to_btVector3(axis);
|
||||
_constraint->setAxis(v);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHingeConstraint::get_lower_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletHingeConstraint::
|
||||
get_lower_limit() const {
|
||||
|
||||
return rad_2_deg(_constraint->getLowerLimit());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHingeConstraint::get_upper_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletHingeConstraint::
|
||||
get_upper_limit() const {
|
||||
|
||||
return rad_2_deg(_constraint->getUpperLimit());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletHingeConstraint::get_hinge_angle
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletHingeConstraint::
|
||||
get_hinge_angle() {
|
||||
|
||||
return rad_2_deg(_constraint->getHingeAngle());
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
// Filename: bulletHingeConstraint.h
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_HINGE_CONSTRAINT_H__
|
||||
#define __BULLET_HINGE_CONSTRAINT_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletConstraint.h"
|
||||
|
||||
#include "lpoint3.h"
|
||||
#include "lvector3.h"
|
||||
|
||||
class BulletRigidBodyNode;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletHingeConstraint
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletHingeConstraint : public BulletConstraint {
|
||||
|
||||
PUBLISHED:
|
||||
BulletHingeConstraint(const BulletRigidBodyNode *node_a,
|
||||
const LPoint3f &pivot_a,
|
||||
const LVector3f &axis_a,
|
||||
bool use_frame_a=false);
|
||||
BulletHingeConstraint(const BulletRigidBodyNode *node_a,
|
||||
const BulletRigidBodyNode *node_b,
|
||||
const LPoint3f &pivot_a,
|
||||
const LPoint3f &pivot_b,
|
||||
const LVector3f &axis_a,
|
||||
const LVector3f &axis_b,
|
||||
bool use_frame_a=false);
|
||||
INLINE ~BulletHingeConstraint();
|
||||
|
||||
float get_hinge_angle();
|
||||
float get_lower_limit() const;
|
||||
float get_upper_limit() const;
|
||||
bool get_angular_only() const;
|
||||
|
||||
void set_angular_only(bool value);
|
||||
void set_limit(float low, float high, float softness=0.9f, float bias=0.3f, float relaxation=1.0f);
|
||||
void set_axis(const LVector3f &axis);
|
||||
|
||||
public:
|
||||
virtual btTypedConstraint *ptr() const;
|
||||
|
||||
private:
|
||||
btHingeConstraint *_constraint;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletConstraint::init_type();
|
||||
register_type(_type_handle, "BulletHingeConstraint",
|
||||
BulletConstraint::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletHingeConstraint.I"
|
||||
|
||||
#endif // __BULLET_HINGE_CONSTRAINT_H__
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
// Filename: bulletManifoldPoint.I
|
||||
// Created by: enn0x (07Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletManifoldPoint::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletManifoldPoint::
|
||||
~BulletManifoldPoint() {
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,103 @@
|
|||
// Filename: bulletManifoldPoint.cxx
|
||||
// Created by: enn0x (07Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletManifoldPoint.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletManifoldPoint::Constructor
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletManifoldPoint::
|
||||
BulletManifoldPoint(btManifoldPoint &pt) : _pt(pt) {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletManifoldPoint::get_lift_time
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
int BulletManifoldPoint::
|
||||
get_lift_time() const {
|
||||
|
||||
return _pt.getLifeTime();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletManifoldPoint::get_distance
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletManifoldPoint::
|
||||
get_distance() const {
|
||||
|
||||
return _pt.getDistance();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletManifoldPoint::get_applied_impulse
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletManifoldPoint::
|
||||
get_applied_impulse() const {
|
||||
|
||||
return _pt.getAppliedImpulse();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletManifoldPoint::get_position_world_on_a
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletManifoldPoint::
|
||||
get_position_world_on_a() const {
|
||||
|
||||
return btVector3_to_LPoint3f(_pt.getPositionWorldOnA());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletManifoldPoint::get_position_world_on_b
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletManifoldPoint::
|
||||
get_position_world_on_b() const {
|
||||
|
||||
return btVector3_to_LPoint3f(_pt.getPositionWorldOnB());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletManifoldPoint::get_local_point_a
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletManifoldPoint::
|
||||
get_local_point_a() const {
|
||||
|
||||
return btVector3_to_LPoint3f(_pt.m_localPointA);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletManifoldPoint::get_local_point_b
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletManifoldPoint::
|
||||
get_local_point_b() const {
|
||||
|
||||
return btVector3_to_LPoint3f(_pt.m_localPointB);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
// Filename: bulletManifoldPoint.h
|
||||
// Created by: enn0x (07Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_MANIFOLD_POINT_H__
|
||||
#define __BULLET_MANIFOLD_POINT_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
|
||||
#include "lpoint3.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletManifoldPoint
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletManifoldPoint {
|
||||
|
||||
PUBLISHED:
|
||||
INLINE ~BulletManifoldPoint();
|
||||
|
||||
int get_lift_time() const;
|
||||
float get_distance() const;
|
||||
float get_applied_impulse() const;
|
||||
LPoint3f get_position_world_on_a() const;
|
||||
LPoint3f get_position_world_on_b() const;
|
||||
LPoint3f get_local_point_a() const;
|
||||
LPoint3f get_local_point_b() const;
|
||||
|
||||
public:
|
||||
BulletManifoldPoint(btManifoldPoint &pt);
|
||||
|
||||
private:
|
||||
btManifoldPoint &_pt;
|
||||
};
|
||||
|
||||
#include "bulletManifoldPoint.I"
|
||||
|
||||
#endif // __BULLET_MANIFOLD_POINT_H__
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
// Filename: bulletPersistentManifold.I
|
||||
// Created by: enn0x (07Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPersistentManifold::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletPersistentManifold::
|
||||
~BulletPersistentManifold() {
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
// Filename: bulletPersistentManifold.cxx
|
||||
// Created by: enn0x (07Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletPersistentManifold.h"
|
||||
#include "bulletManifoldPoint.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPersistentManifold::Constructor
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletPersistentManifold::
|
||||
BulletPersistentManifold(btPersistentManifold *manifold) : _manifold(manifold) {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPersistentManifold::get_contact_breaking_threshold
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletPersistentManifold::
|
||||
get_contact_breaking_threshold() const {
|
||||
|
||||
return _manifold->getContactBreakingThreshold();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPersistentManifold::get_contact_processing_threshold
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletPersistentManifold::
|
||||
get_contact_processing_threshold() const {
|
||||
|
||||
return _manifold->getContactProcessingThreshold();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPersistentManifold::set_suspension_stiffness
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletPersistentManifold::
|
||||
clear_manifold() {
|
||||
|
||||
_manifold->clearManifold();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPersistentManifold::get_node0
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
PandaNode *BulletPersistentManifold::
|
||||
get_node0() {
|
||||
|
||||
btCollisionObject *obj = static_cast<btCollisionObject *>(_manifold->getBody0());
|
||||
|
||||
return (obj) ? (PandaNode *)obj->getUserPointer(): NULL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPersistentManifold::get_node1
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
PandaNode *BulletPersistentManifold::
|
||||
get_node1() {
|
||||
|
||||
btCollisionObject *obj = static_cast<btCollisionObject *>(_manifold->getBody1());
|
||||
|
||||
return (obj) ? (PandaNode *)obj->getUserPointer(): NULL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPersistentManifold::get_num_manifold_points
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
int BulletPersistentManifold::
|
||||
get_num_manifold_points() const {
|
||||
|
||||
return _manifold->getNumContacts();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPersistentManifold::get_manifold_point
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletManifoldPoint *BulletPersistentManifold::
|
||||
get_manifold_point(int idx) const {
|
||||
|
||||
nassertr(idx < _manifold->getNumContacts(), NULL)
|
||||
|
||||
return new BulletManifoldPoint(_manifold->getContactPoint(idx));
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
// Filename: bulletPersistentManifold.h
|
||||
// Created by: enn0x (07Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_PERSISTENT_MANIFOLD_H__
|
||||
#define __BULLET_PERSISTENT_MANIFOLD_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
|
||||
#include "pandaNode.h"
|
||||
|
||||
class BulletManifoldPoint;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletPersistentManifold
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletPersistentManifold {
|
||||
|
||||
PUBLISHED:
|
||||
INLINE ~BulletPersistentManifold();
|
||||
|
||||
PandaNode *get_node0();
|
||||
PandaNode *get_node1();
|
||||
|
||||
int get_num_manifold_points() const;
|
||||
BulletManifoldPoint *get_manifold_point(int idx) const;
|
||||
MAKE_SEQ(get_manifold_points, get_num_manifold_points, get_manifold_point);
|
||||
|
||||
float get_contact_breaking_threshold() const;
|
||||
float get_contact_processing_threshold() const;
|
||||
|
||||
void clear_manifold();
|
||||
|
||||
public:
|
||||
BulletPersistentManifold(btPersistentManifold *manifold);
|
||||
|
||||
private:
|
||||
btPersistentManifold *_manifold;
|
||||
};
|
||||
|
||||
#include "bulletPersistentManifold.I"
|
||||
|
||||
#endif // __BULLET_PERSISTENT_MANIFOLD_H__
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
// Filename: bulletPlaneShape.I
|
||||
// Created by: enn0x (23Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPlaneShape::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletPlaneShape::
|
||||
~BulletPlaneShape() {
|
||||
|
||||
delete _shape;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPlaneShape::get_plane_constant
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletPlaneShape::
|
||||
get_plane_constant() const {
|
||||
|
||||
return _shape->getPlaneConstant();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPlaneShape::get_plane_normal
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE LVector3f BulletPlaneShape::
|
||||
get_plane_normal() const {
|
||||
|
||||
return btVector3_to_LVector3f(_shape->getPlaneNormal());
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
// Filename: bulletPlaneShape.cxx
|
||||
// Created by: enn0x (23Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletPlaneShape.h"
|
||||
|
||||
TypeHandle BulletPlaneShape::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPlaneShape::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletPlaneShape::
|
||||
BulletPlaneShape(const LVector3f &normal, float constant) {
|
||||
|
||||
btVector3 btNormal = LVecBase3f_to_btVector3(normal);
|
||||
|
||||
_shape = new btStaticPlaneShape(btNormal, constant);
|
||||
_shape->setUserPointer(this);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPlaneShape::ptr
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btCollisionShape *BulletPlaneShape::
|
||||
ptr() const {
|
||||
|
||||
return _shape;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletPlaneShape::make_from_solid
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletPlaneShape *BulletPlaneShape::
|
||||
make_from_solid(const CollisionPlane *solid) {
|
||||
|
||||
LVector3f normal = solid->get_normal();
|
||||
float constant = solid->dist_to_plane(LPoint3f(0, 0, 0));
|
||||
|
||||
return new BulletPlaneShape(normal, constant);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
// Filename: bulletPlaneShape.h
|
||||
// Created by: enn0x (23Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_PLANE_SHAPE_H__
|
||||
#define __BULLET_PLANE_SHAPE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletShape.h"
|
||||
|
||||
#include "collisionPlane.h"
|
||||
#include "lvector3.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletPlaneShape
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletPlaneShape : public BulletShape {
|
||||
|
||||
PUBLISHED:
|
||||
BulletPlaneShape(const LVector3f &normal, float constant);
|
||||
INLINE ~BulletPlaneShape();
|
||||
|
||||
INLINE LVector3f get_plane_normal() const;
|
||||
INLINE float get_plane_constant() const;
|
||||
|
||||
static BulletPlaneShape *make_from_solid(const CollisionPlane *solid);
|
||||
|
||||
public:
|
||||
virtual btCollisionShape *ptr() const;
|
||||
|
||||
private:
|
||||
btStaticPlaneShape *_shape;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletShape::init_type();
|
||||
register_type(_type_handle, "BulletPlaneShape",
|
||||
BulletShape::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletPlaneShape.I"
|
||||
|
||||
#endif // __BULLET_PLANE_SHAPE_H__
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
// Filename: bulletRigidBodyNode.I
|
||||
// Created by: enn0x (19Nov10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletRigidBodyNode::
|
||||
~BulletRigidBodyNode() {
|
||||
|
||||
delete _body;
|
||||
delete _motion;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::set_linear_damping
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletRigidBodyNode::
|
||||
set_linear_damping(float value) {
|
||||
|
||||
_body->setDamping(value, _body->getAngularDamping());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::set_angular_damping
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletRigidBodyNode::
|
||||
set_angular_damping(float value) {
|
||||
|
||||
_body->setDamping(_body->getLinearDamping(), value);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::get_linear_damping
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletRigidBodyNode::
|
||||
get_linear_damping() const {
|
||||
|
||||
return _body->getLinearDamping();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::get_angular_damping
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletRigidBodyNode::
|
||||
get_angular_damping() const {
|
||||
|
||||
return _body->getAngularDamping();
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,418 @@
|
|||
// Filename: bulletRigidBodyNode.cxx
|
||||
// Created by: enn0x (19Nov10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletRigidBodyNode.h"
|
||||
#include "bulletShape.h"
|
||||
|
||||
TypeHandle BulletRigidBodyNode::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletRigidBodyNode::
|
||||
BulletRigidBodyNode(const char *name) : BulletBodyNode(name) {
|
||||
|
||||
// Setup motion state
|
||||
_motion = new MotionState(this);
|
||||
|
||||
// Setup mass properties
|
||||
btScalar mass(0.0);
|
||||
btVector3 inertia(0, 0, 0);
|
||||
|
||||
btRigidBody::btRigidBodyConstructionInfo ci(mass, _motion, _shape, inertia);
|
||||
|
||||
// Enable additional damping
|
||||
if (bullet_additional_damping) {
|
||||
ci.m_additionalDamping = true;
|
||||
ci.m_additionalDampingFactor = bullet_additional_damping_linear_factor;
|
||||
ci.m_additionalLinearDampingThresholdSqr = bullet_additional_damping_linear_threshold;
|
||||
ci.m_additionalAngularDampingFactor = bullet_additional_damping_angular_factor;
|
||||
ci.m_additionalAngularDampingThresholdSqr = bullet_additional_damping_angular_threshold;
|
||||
}
|
||||
|
||||
// Setup rigid body
|
||||
_body = new btRigidBody(ci);
|
||||
_body->setUserPointer(this);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::get_object
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btCollisionObject *BulletRigidBodyNode::
|
||||
get_object() const {
|
||||
|
||||
return _body;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::shape_changed
|
||||
// Access: Published
|
||||
// Description: Hook which will be called whenever the total shape
|
||||
// of a body changed. Used for example to update
|
||||
// the mass properties (inertia) of a rigid body.
|
||||
// The default implementation does nothing.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
shape_changed() {
|
||||
|
||||
set_mass(get_mass());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::set_mass
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
set_mass(float mass) {
|
||||
|
||||
btVector3 inertia(0.0f, 0.0f, 0.0f);
|
||||
|
||||
if (mass > 0.0f) {
|
||||
_body->getCollisionShape()->calculateLocalInertia(mass, inertia);
|
||||
}
|
||||
|
||||
_body->setMassProps(mass, inertia);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::get_mass
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletRigidBodyNode::
|
||||
get_mass() const {
|
||||
|
||||
btScalar invMass = _body->getInvMass();
|
||||
|
||||
if (invMass == 0.0f) {
|
||||
return 0.0f;
|
||||
}
|
||||
else {
|
||||
return 1.0f / invMass;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::apply_force
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
apply_force(const LVector3f &force, const LPoint3f &pos) {
|
||||
|
||||
nassertv_always(!force.is_nan());
|
||||
nassertv_always(!pos.is_nan());
|
||||
|
||||
_body->applyForce(LVecBase3f_to_btVector3(force),
|
||||
LVecBase3f_to_btVector3(pos));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::apply_central_force
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
apply_central_force(const LVector3f &force) {
|
||||
|
||||
nassertv_always(!force.is_nan());
|
||||
|
||||
_body->applyCentralForce(LVecBase3f_to_btVector3(force));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::apply_torque
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
apply_torque(const LVector3f &torque) {
|
||||
|
||||
nassertv_always(!torque.is_nan());
|
||||
|
||||
_body->applyTorque(LVecBase3f_to_btVector3(torque));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::apply_torque_impulse
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
apply_torque_impulse(const LVector3f &torque) {
|
||||
|
||||
nassertv_always(!torque.is_nan());
|
||||
|
||||
_body->applyTorqueImpulse(LVecBase3f_to_btVector3(torque));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::apply_impulse
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
apply_impulse(const LVector3f &impulse, const LPoint3f &pos) {
|
||||
|
||||
nassertv_always(!impulse.is_nan());
|
||||
nassertv_always(!pos.is_nan());
|
||||
|
||||
_body->applyImpulse(LVecBase3f_to_btVector3(impulse),
|
||||
LVecBase3f_to_btVector3(pos));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::apply_central_impulse
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
apply_central_impulse(const LVector3f &impulse) {
|
||||
|
||||
nassertv_always(!impulse.is_nan());
|
||||
|
||||
_body->applyCentralImpulse(LVecBase3f_to_btVector3(impulse));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::parents_changed
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
parents_changed() {
|
||||
|
||||
transform_changed();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::transform_changed
|
||||
// Access: Protected
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
transform_changed() {
|
||||
|
||||
if (_disable_transform_changed) return;
|
||||
|
||||
btTransform trans;
|
||||
get_node_transform(trans, this);
|
||||
_body->setWorldTransform(trans);
|
||||
_body->setInterpolationWorldTransform(trans);
|
||||
|
||||
BulletBodyNode::transform_changed();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::MotionState::getWorldTransform
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::MotionState::
|
||||
getWorldTransform(btTransform &trans) const {
|
||||
|
||||
get_node_transform(trans, _node);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::MotionState::setWorldTransform
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::MotionState::
|
||||
setWorldTransform(const btTransform &trans) {
|
||||
|
||||
if (trans.getOrigin().getX() != trans.getOrigin().getX()) {
|
||||
bullet_cat.error() << "setWorldTransform: trans is NAN!" << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
LVecBase3f scale = _node->get_transform()->get_scale();
|
||||
CPT(TransformState) ts = btTrans_to_TransformState(trans, scale);
|
||||
|
||||
// Disable transform_changed callback
|
||||
_node->_disable_transform_changed = true;
|
||||
|
||||
if (_node->get_num_parents() == 0) {
|
||||
_node->set_transform(ts);
|
||||
}
|
||||
else {
|
||||
NodePath np = NodePath::any_path(_node);
|
||||
np.set_transform(np.get_top(), ts);
|
||||
}
|
||||
|
||||
// Re-enable transform_changed callback again
|
||||
_node->_disable_transform_changed = false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::set_center_of_mass_pos
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
set_center_of_mass_pos(const LPoint3f &pos) {
|
||||
|
||||
nassertv_always(!pos.is_nan());
|
||||
|
||||
btTransform xform;
|
||||
xform.setIdentity();
|
||||
xform.setOrigin(LVecBase3f_to_btVector3(pos));
|
||||
|
||||
_body->setCenterOfMassTransform(xform);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::get_center_of_mass_pos
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LPoint3f BulletRigidBodyNode::
|
||||
get_center_of_mass_pos() const {
|
||||
|
||||
return btVector3_to_LPoint3f(_body->getCenterOfMassPosition());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::get_linear_velocity
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LVector3f BulletRigidBodyNode::
|
||||
get_linear_velocity() const {
|
||||
|
||||
return btVector3_to_LVector3f(_body->getLinearVelocity());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::get_angular_velocity
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LVector3f BulletRigidBodyNode::
|
||||
get_angular_velocity() const {
|
||||
|
||||
return btVector3_to_LVector3f(_body->getAngularVelocity());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::set_linear_velocity
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
set_linear_velocity(const LVector3f &velocity) {
|
||||
|
||||
nassertv_always(!velocity.is_nan());
|
||||
|
||||
_body->setLinearVelocity(LVecBase3f_to_btVector3(velocity));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::set_angular_velocity
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
set_angular_velocity(const LVector3f &velocity) {
|
||||
|
||||
nassertv_always(!velocity.is_nan());
|
||||
|
||||
_body->setAngularVelocity(LVecBase3f_to_btVector3(velocity));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::clear_forces
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
clear_forces() {
|
||||
|
||||
_body->clearForces();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::get_linear_sleep_threshold
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletRigidBodyNode::
|
||||
get_linear_sleep_threshold() const {
|
||||
|
||||
return _body->getLinearSleepingThreshold();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::get_angular_sleep_threshold
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletRigidBodyNode::
|
||||
get_angular_sleep_threshold() const {
|
||||
|
||||
return _body->getAngularSleepingThreshold();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::set_linear_sleep_threshold
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
set_linear_sleep_threshold(float threshold) {
|
||||
|
||||
_body->setSleepingThresholds(_body->getLinearSleepingThreshold(), threshold);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::set_angular_sleep_threshold
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
set_angular_sleep_threshold(float threshold) {
|
||||
|
||||
_body->setSleepingThresholds(threshold, _body->getAngularSleepingThreshold());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::set_gravity
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletRigidBodyNode::
|
||||
set_gravity(const LVector3f &gravity) {
|
||||
|
||||
nassertv_always(!gravity.is_nan());
|
||||
|
||||
_body->setGravity(LVecBase3f_to_btVector3(gravity));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletRigidBodyNode::get_gravity
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LVector3f BulletRigidBodyNode::
|
||||
get_gravity() const {
|
||||
|
||||
return btVector3_to_LVector3f(_body->getGravity());
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
// Filename: bulletRigidBodyNode.h
|
||||
// Created by: enn0x (19Nov10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_RIGID_BODY_NODE_H__
|
||||
#define __BULLET_RIGID_BODY_NODE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletBodyNode.h"
|
||||
|
||||
#include "pandaNode.h"
|
||||
#include "collideMask.h"
|
||||
|
||||
class BulletShape;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletRigidBodyNode
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletRigidBodyNode : public BulletBodyNode {
|
||||
|
||||
PUBLISHED:
|
||||
BulletRigidBodyNode(const char *name="rigid");
|
||||
INLINE ~BulletRigidBodyNode();
|
||||
|
||||
// Mass
|
||||
LPoint3f get_center_of_mass_pos() const;
|
||||
float get_mass() const;
|
||||
void set_center_of_mass_pos(const LPoint3f &pos);
|
||||
void set_mass(float mass);
|
||||
|
||||
// Velocity
|
||||
LVector3f get_linear_velocity() const;
|
||||
LVector3f get_angular_velocity() const;
|
||||
void set_linear_velocity(const LVector3f &velocity);
|
||||
void set_angular_velocity(const LVector3f &velocity);
|
||||
|
||||
// Damping
|
||||
INLINE float get_linear_damping() const;
|
||||
INLINE float get_angular_damping() const;
|
||||
INLINE void set_linear_damping(float value);
|
||||
INLINE void set_angular_damping(float value);
|
||||
|
||||
// Forces
|
||||
void clear_forces();
|
||||
void apply_force(const LVector3f &force, const LPoint3f &pos);
|
||||
void apply_central_force(const LVector3f &force);
|
||||
void apply_impulse(const LVector3f &impulse, const LPoint3f &pos);
|
||||
void apply_central_impulse(const LVector3f &impulse);
|
||||
void apply_torque(const LVector3f &torque);
|
||||
void apply_torque_impulse(const LVector3f &torque);
|
||||
|
||||
// Deactivation thresholds
|
||||
float get_linear_sleep_threshold() const;
|
||||
float get_angular_sleep_threshold() const;
|
||||
void set_linear_sleep_threshold(float threshold);
|
||||
void set_angular_sleep_threshold(float threshold);
|
||||
|
||||
// Gravity
|
||||
void set_gravity(const LVector3f &gravity);
|
||||
LVector3f get_gravity() const;
|
||||
|
||||
public:
|
||||
virtual btCollisionObject *get_object() const;
|
||||
|
||||
protected:
|
||||
virtual void parents_changed();
|
||||
virtual void transform_changed();
|
||||
|
||||
private:
|
||||
virtual void shape_changed();
|
||||
|
||||
class MotionState : public btMotionState {
|
||||
|
||||
public:
|
||||
MotionState(BulletRigidBodyNode *node) : _node(node) {};
|
||||
~MotionState() {};
|
||||
|
||||
virtual void getWorldTransform(btTransform &trans) const;
|
||||
virtual void setWorldTransform(const btTransform &trans);
|
||||
|
||||
private:
|
||||
BulletRigidBodyNode *_node;
|
||||
};
|
||||
|
||||
btRigidBody *_body;
|
||||
MotionState *_motion;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletBodyNode::init_type();
|
||||
register_type(_type_handle, "BulletRigidBodyNode",
|
||||
BulletBodyNode::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletRigidBodyNode.I"
|
||||
|
||||
#endif // __BULLET_RIGID_BODY_NODE_H__
|
||||
|
||||
|
|
@ -0,0 +1,101 @@
|
|||
// Filename: bulletShape.I
|
||||
// Created by: enn0x (23Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletShape::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletShape::
|
||||
~BulletShape() {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletShape::is_polyhedral
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool BulletShape::
|
||||
is_polyhedral() const {
|
||||
|
||||
return ptr()->isPolyhedral();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletShape::is_convex
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool BulletShape::
|
||||
is_convex() const {
|
||||
|
||||
return ptr()->isConvex();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletShape::is_convex_2d
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool BulletShape::
|
||||
is_convex_2d() const {
|
||||
|
||||
return ptr()->isConvex2d();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletShape::is_concave
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool BulletShape::
|
||||
is_concave() const {
|
||||
|
||||
return ptr()->isConcave();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletShape::is_infinite
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool BulletShape::
|
||||
is_infinite() const {
|
||||
|
||||
return ptr()->isInfinite();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletShape::is_non_moving
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool BulletShape::
|
||||
is_non_moving() const {
|
||||
|
||||
return ptr()->isNonMoving();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletShape::is_soft_body
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE bool BulletShape::
|
||||
is_soft_body() const {
|
||||
|
||||
return ptr()->isSoftBody();
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
// Filename: bulletShape.cxx
|
||||
// Created by: enn0x (23Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletShape.h"
|
||||
#include "bullet_utils.h"
|
||||
|
||||
TypeHandle BulletShape::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletShape::get_name
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
const char *BulletShape::
|
||||
get_name() const {
|
||||
|
||||
return ptr()->getName();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletShape::get_margin
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletShape::
|
||||
get_margin() const {
|
||||
|
||||
return ptr()->getMargin();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletShape::set_margin
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletShape::
|
||||
set_margin(float margin) {
|
||||
|
||||
ptr()->setMargin(margin);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletShape::get_local_scale
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
LVecBase3f BulletShape::
|
||||
get_local_scale() const {
|
||||
|
||||
return btVector3_to_LVecBase3f(ptr()->getLocalScaling());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletShape::set_local_scale
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletShape::
|
||||
set_local_scale(const LVecBase3f &scale) {
|
||||
|
||||
nassertv(!scale.is_nan());
|
||||
ptr()->setLocalScaling(LVecBase3f_to_btVector3(scale));
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
// Filename: bulletShape.h
|
||||
// Created by: enn0x (23Jan10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_SHAPE_H__
|
||||
#define __BULLET_SHAPE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
|
||||
#include "typedReferenceCount.h"
|
||||
//#include "lvector3.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletShape
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletShape : public TypedReferenceCount {
|
||||
|
||||
PUBLISHED:
|
||||
INLINE virtual ~BulletShape();
|
||||
|
||||
INLINE bool is_polyhedral() const;
|
||||
INLINE bool is_convex() const;
|
||||
INLINE bool is_convex_2d() const;
|
||||
INLINE bool is_concave() const;
|
||||
INLINE bool is_infinite() const;
|
||||
INLINE bool is_non_moving() const;
|
||||
INLINE bool is_soft_body() const;
|
||||
|
||||
void set_margin(float margin);
|
||||
void set_local_scale(const LVecBase3f &scaling);
|
||||
|
||||
const char *get_name() const;
|
||||
float get_margin() const;
|
||||
LVecBase3f get_local_scale() const;
|
||||
|
||||
public:
|
||||
virtual btCollisionShape *ptr() const = 0;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
TypedReferenceCount::init_type();
|
||||
register_type(_type_handle, "BulletShape",
|
||||
TypedReferenceCount::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletShape.I"
|
||||
|
||||
#endif // __BULLET_SHAPE_H__
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
// Filename: bulletSliderConstraint.I
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSliderConstraint::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletSliderConstraint::
|
||||
~BulletSliderConstraint() {
|
||||
|
||||
delete _constraint;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,157 @@
|
|||
// Filename: bulletSliderConstraint.cxx
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletSliderConstraint.h"
|
||||
#include "bulletRigidBodyNode.h"
|
||||
|
||||
#include "deg_2_rad.h"
|
||||
|
||||
TypeHandle BulletSliderConstraint::_type_handle;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSliderConstraint::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletSliderConstraint::
|
||||
BulletSliderConstraint(const BulletRigidBodyNode *node_a,
|
||||
const TransformState &frame_a,
|
||||
bool use_frame_a) {
|
||||
|
||||
btRigidBody *ptr_a = btRigidBody::upcast(node_a->get_object());
|
||||
btTransform trans_a = LMatrix4f_to_btTrans(frame_a.get_mat());
|
||||
|
||||
_constraint = new btSliderConstraint(*ptr_a, trans_a, use_frame_a);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSliderConstraint::Constructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletSliderConstraint::
|
||||
BulletSliderConstraint(const BulletRigidBodyNode *node_a,
|
||||
const BulletRigidBodyNode *node_b,
|
||||
const TransformState &frame_a,
|
||||
const TransformState &frame_b,
|
||||
bool use_frame_a) {
|
||||
|
||||
btRigidBody *ptr_a = btRigidBody::upcast(node_a->get_object());
|
||||
btTransform trans_a = LMatrix4f_to_btTrans(frame_a.get_mat());
|
||||
|
||||
btRigidBody *ptr_b = btRigidBody::upcast(node_b->get_object());
|
||||
btTransform trans_b = LMatrix4f_to_btTrans(frame_b.get_mat());
|
||||
|
||||
_constraint = new btSliderConstraint(*ptr_a, *ptr_b, trans_a, trans_b, use_frame_a);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSliderConstraint::ptr
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
btTypedConstraint *BulletSliderConstraint::
|
||||
ptr() const {
|
||||
|
||||
return _constraint;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSliderConstraint::get_lower_linear_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletSliderConstraint::
|
||||
get_lower_linear_limit() {
|
||||
|
||||
return _constraint->getLowerLinLimit();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSliderConstraint::get_upper_linear_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletSliderConstraint::
|
||||
get_upper_linear_limit() {
|
||||
|
||||
return _constraint->getUpperLinLimit();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSliderConstraint::get_lower_angular_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletSliderConstraint::
|
||||
get_lower_angular_limit() {
|
||||
|
||||
return rad_2_deg(_constraint->getLowerAngLimit());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSliderConstraint::get_upper_angular_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float BulletSliderConstraint::
|
||||
get_upper_angular_limit() {
|
||||
|
||||
return rad_2_deg(_constraint->getUpperAngLimit());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSliderConstraint::set_lower_linear_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletSliderConstraint::
|
||||
set_lower_linear_limit(float value) {
|
||||
|
||||
_constraint->setLowerLinLimit(value);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSliderConstraint::set_upper_linear_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletSliderConstraint::
|
||||
set_upper_linear_limit(float value) {
|
||||
|
||||
_constraint->setUpperLinLimit(value);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSliderConstraint::set_lower_angular_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletSliderConstraint::
|
||||
set_lower_angular_limit(float value) {
|
||||
|
||||
_constraint->setLowerAngLimit(deg_2_rad(value));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSliderConstraint::set_upper_angular_limit
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletSliderConstraint::
|
||||
set_upper_angular_limit(float value) {
|
||||
|
||||
_constraint->setUpperAngLimit(deg_2_rad(value));
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
// Filename: bulletSliderConstraint.h
|
||||
// Created by: enn0x (01Mar10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_SLIDER_CONSTRAINT_H__
|
||||
#define __BULLET_SLIDER_CONSTRAINT_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletConstraint.h"
|
||||
|
||||
#include "transformState.h"
|
||||
|
||||
class BulletRigidBodyNode;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletSliderConstraint
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletSliderConstraint : public BulletConstraint {
|
||||
|
||||
PUBLISHED:
|
||||
BulletSliderConstraint(const BulletRigidBodyNode *node_a,
|
||||
const TransformState &frame_a,
|
||||
bool useFrame_a);
|
||||
BulletSliderConstraint(const BulletRigidBodyNode *node_a,
|
||||
const BulletRigidBodyNode *node_b,
|
||||
const TransformState &frame_a,
|
||||
const TransformState &frame_b,
|
||||
bool use_frame_a);
|
||||
INLINE ~BulletSliderConstraint();
|
||||
|
||||
float get_lower_linear_limit();
|
||||
float get_upper_linear_limit();
|
||||
float get_lower_angular_limit();
|
||||
float get_upper_angular_limit();
|
||||
|
||||
void set_lower_linear_limit(float value);
|
||||
void set_upper_linear_limit(float value);
|
||||
void set_lower_angular_limit(float value);
|
||||
void set_upper_angular_limit(float value);
|
||||
|
||||
public:
|
||||
virtual btTypedConstraint *ptr() const;
|
||||
|
||||
private:
|
||||
btSliderConstraint *_constraint;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletConstraint::init_type();
|
||||
register_type(_type_handle, "BulletSliderConstraint",
|
||||
BulletConstraint::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletSliderConstraint.I"
|
||||
|
||||
#endif // __BULLET_SLIDER_CONSTRAINT_H__
|
||||
|
|
@ -0,0 +1,556 @@
|
|||
// Filename: bulletSoftBodyConfig.I
|
||||
// Created by: enn0x (12Apr10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletSoftBodyConfig::
|
||||
~BulletSoftBodyConfig() {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_velocities_correction_factor
|
||||
// Access: Published
|
||||
// Description: Getter for property kVCF.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_velocities_correction_factor() const {
|
||||
|
||||
return _cfg.kVCF;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_velocities_correction_factor
|
||||
// Access: Published
|
||||
// Description: Setter for property kVCF.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_velocities_correction_factor(float value) {
|
||||
|
||||
_cfg.kVCF = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_damping_coefficient
|
||||
// Access: Published
|
||||
// Description: Getter for property kDP.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_damping_coefficient() const {
|
||||
|
||||
return _cfg.kDP;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_damping_coefficient
|
||||
// Access: Published
|
||||
// Description: Setter for property kDP.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_damping_coefficient(float value) {
|
||||
|
||||
_cfg.kDP = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_drag_coefficient
|
||||
// Access: Published
|
||||
// Description: Getter for property kDG.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_drag_coefficient() const {
|
||||
|
||||
return _cfg.kDG;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_drag_coefficient
|
||||
// Access: Published
|
||||
// Description: Setter for property kDG.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_drag_coefficient(float value) {
|
||||
|
||||
_cfg.kDG = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_lift_coefficient
|
||||
// Access: Published
|
||||
// Description: Getter for property kLF.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_lift_coefficient() const {
|
||||
|
||||
return _cfg.kLF;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_lift_coefficient
|
||||
// Access: Published
|
||||
// Description: Setter for property kLF.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_lift_coefficient(float value) {
|
||||
|
||||
_cfg.kLF = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_pressure_coefficient
|
||||
// Access: Published
|
||||
// Description: Getter for property kPR.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_pressure_coefficient() const {
|
||||
|
||||
return _cfg.kPR;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_pressure_coefficient
|
||||
// Access: Published
|
||||
// Description: Setter for property kPR.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_pressure_coefficient(float value) {
|
||||
|
||||
_cfg.kPR = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_volume_conversation_coefficient
|
||||
// Access: Published
|
||||
// Description: Getter for property kVC.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_volume_conversation_coefficient() const {
|
||||
|
||||
return _cfg.kVC;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_volume_conversation_coefficient
|
||||
// Access: Published
|
||||
// Description: Setter for property kVC.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_volume_conversation_coefficient(float value) {
|
||||
|
||||
_cfg.kVC = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_dynamic_friction_coefficient
|
||||
// Access: Published
|
||||
// Description: Getter for property kDF.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_dynamic_friction_coefficient() const {
|
||||
|
||||
return _cfg.kDF;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_dynamic_friction_coefficient
|
||||
// Access: Published
|
||||
// Description: Setter for property kDF.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_dynamic_friction_coefficient(float value) {
|
||||
|
||||
_cfg.kDF = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_pose_matching_coefficient
|
||||
// Access: Published
|
||||
// Description: Getter for property kMT.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_pose_matching_coefficient() const {
|
||||
|
||||
return _cfg.kMT;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_pose_matching_coefficient
|
||||
// Access: Published
|
||||
// Description: Setter for property kMT.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_pose_matching_coefficient(float value) {
|
||||
|
||||
_cfg.kMT = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_rigid_contacts_hardness
|
||||
// Access: Published
|
||||
// Description: Getter for property kCHR.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_rigid_contacts_hardness() const {
|
||||
|
||||
return _cfg.kCHR;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_rigid_contacts_hardness
|
||||
// Access: Published
|
||||
// Description: Setter for property kCHR.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_rigid_contacts_hardness(float value) {
|
||||
|
||||
_cfg.kCHR = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_kinetic_contacts_hardness
|
||||
// Access: Published
|
||||
// Description: Getter for property kKHR.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_kinetic_contacts_hardness() const {
|
||||
|
||||
return _cfg.kKHR;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_kinetic_contacts_hardness
|
||||
// Access: Published
|
||||
// Description: Setter for property kKHR.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_kinetic_contacts_hardness(float value) {
|
||||
|
||||
_cfg.kKHR = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_soft_contacts_hardness
|
||||
// Access: Published
|
||||
// Description: Getter for property kSHR.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_soft_contacts_hardness() const {
|
||||
|
||||
return _cfg.kSHR;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_soft_contacts_hardness
|
||||
// Access: Published
|
||||
// Description: Setter for property kSHR.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_soft_contacts_hardness(float value) {
|
||||
|
||||
_cfg.kSHR = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_anchors_hardness
|
||||
// Access: Published
|
||||
// Description: Getter for property kAHR.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_anchors_hardness() const {
|
||||
|
||||
return _cfg.kAHR;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_anchors_hardness
|
||||
// Access: Published
|
||||
// Description: Setter for property kAHR.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_anchors_hardness(float value) {
|
||||
|
||||
_cfg.kAHR = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_soft_vs_rigid_hardness
|
||||
// Access: Published
|
||||
// Description: Getter for property kSRHR_CL.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_soft_vs_rigid_hardness() const {
|
||||
|
||||
return _cfg.kSRHR_CL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_soft_vs_rigid_hardness
|
||||
// Access: Published
|
||||
// Description: Setter for property kSRHR_CL.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_soft_vs_rigid_hardness(float value) {
|
||||
|
||||
_cfg.kSRHR_CL = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_soft_vs_kinetic_hardness
|
||||
// Access: Published
|
||||
// Description: Getter for property kSKHR_CL.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_soft_vs_kinetic_hardness() const {
|
||||
|
||||
return _cfg.kSKHR_CL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_soft_vs_kinetic_hardness
|
||||
// Access: Published
|
||||
// Description: Setter for property kSKHR_CL.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_soft_vs_kinetic_hardness(float value) {
|
||||
|
||||
_cfg.kSKHR_CL = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_soft_vs_soft_hardness
|
||||
// Access: Published
|
||||
// Description: Getter for property kSSHR_CL.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_soft_vs_soft_hardness() const {
|
||||
|
||||
return _cfg.kSSHR_CL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_soft_vs_soft_hardness
|
||||
// Access: Published
|
||||
// Description: Setter for property kSSHR_CL.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_soft_vs_soft_hardness(float value) {
|
||||
|
||||
_cfg.kSSHR_CL = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_soft_vs_rigid_impulse_split
|
||||
// Access: Published
|
||||
// Description: Getter for property kSR_SPLT_CL.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_soft_vs_rigid_impulse_split() const {
|
||||
|
||||
return _cfg.kSR_SPLT_CL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_soft_vs_rigid_impulse_split
|
||||
// Access: Published
|
||||
// Description: Setter for property kSR_SPLT_CL.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_soft_vs_rigid_impulse_split(float value) {
|
||||
|
||||
_cfg.kSR_SPLT_CL = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_soft_vs_kinetic_impulse_split
|
||||
// Access: Published
|
||||
// Description: Getter for property kSK_SPLT_CL.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_soft_vs_kinetic_impulse_split() const {
|
||||
|
||||
return _cfg.kSK_SPLT_CL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_soft_vs_kinetic_impulse_split
|
||||
// Access: Published
|
||||
// Description: Setter for property kSK_SPLT_CL.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_soft_vs_kinetic_impulse_split(float value) {
|
||||
|
||||
_cfg.kSK_SPLT_CL = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_soft_vs_soft_impulse_split
|
||||
// Access: Published
|
||||
// Description: Getter for property kSS_SPLT_CL.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_soft_vs_soft_impulse_split() const {
|
||||
|
||||
return _cfg.kSS_SPLT_CL;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_soft_vs_soft_impulse_split
|
||||
// Access: Published
|
||||
// Description: Setter for property kSS_SPLT_CL.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_soft_vs_soft_impulse_split(float value) {
|
||||
|
||||
_cfg.kSS_SPLT_CL = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_maxvolume
|
||||
// Access: Published
|
||||
// Description: Getter for property maxvolume.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_maxvolume() const {
|
||||
|
||||
return _cfg.maxvolume;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_maxvolume
|
||||
// Access: Published
|
||||
// Description: Setter for property maxvolume.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_maxvolume(float value) {
|
||||
|
||||
_cfg.maxvolume = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_timescale
|
||||
// Access: Published
|
||||
// Description: Getter for property timescale.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyConfig::
|
||||
get_timescale() const {
|
||||
|
||||
return _cfg.timescale;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_timescale
|
||||
// Access: Published
|
||||
// Description: Setter for property timescale.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_timescale(float value) {
|
||||
|
||||
_cfg.timescale = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_positions_solver_iterations
|
||||
// Access: Published
|
||||
// Description: Getter for property piterations.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE int BulletSoftBodyConfig::
|
||||
get_positions_solver_iterations() const {
|
||||
|
||||
return _cfg.piterations;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_positions_solver_iterations
|
||||
// Access: Published
|
||||
// Description: Setter for property piterations.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_positions_solver_iterations(int value) {
|
||||
|
||||
nassertv(value > 0);
|
||||
_cfg.piterations = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_velocities_solver_iterations
|
||||
// Access: Published
|
||||
// Description: Getter for property viterations.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE int BulletSoftBodyConfig::
|
||||
get_velocities_solver_iterations() const {
|
||||
|
||||
return _cfg.viterations;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_velocities_solver_iterations
|
||||
// Access: Published
|
||||
// Description: Setter for property viterations.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_velocities_solver_iterations(int value) {
|
||||
|
||||
nassertv(value > 0);
|
||||
_cfg.viterations = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_drift_solver_iterations
|
||||
// Access: Published
|
||||
// Description: Getter for property diterations.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE int BulletSoftBodyConfig::
|
||||
get_drift_solver_iterations() const {
|
||||
|
||||
return _cfg.diterations;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_drift_solver_iterations
|
||||
// Access: Published
|
||||
// Description: Setter for property diterations.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_drift_solver_iterations(int value) {
|
||||
|
||||
nassertv(value > 0);
|
||||
_cfg.diterations = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_cluster_solver_iterations
|
||||
// Access: Published
|
||||
// Description: Getter for property citerations.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE int BulletSoftBodyConfig::
|
||||
get_cluster_solver_iterations() const {
|
||||
|
||||
return _cfg.citerations;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_cluster_solver_iterations
|
||||
// Access: Published
|
||||
// Description: Setter for property citerations.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyConfig::
|
||||
set_cluster_solver_iterations(int value) {
|
||||
|
||||
nassertv(value > 0);
|
||||
_cfg.citerations = value;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
// Filename: bulletSoftBodyConfig.cxx
|
||||
// Created by: enn0x (12Apr10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletSoftBodyConfig.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::Constructor
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletSoftBodyConfig::
|
||||
BulletSoftBodyConfig(btSoftBody::Config &cfg) : _cfg(cfg) {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::clear_collisions
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletSoftBodyConfig::
|
||||
clear_all_collision_flags() {
|
||||
|
||||
_cfg.collisions = 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_collisions
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletSoftBodyConfig::
|
||||
set_collision_flag(CollisionFlag flag, bool value) {
|
||||
|
||||
if (value == true) {
|
||||
_cfg.collisions |= flag;
|
||||
}
|
||||
else {
|
||||
_cfg.collisions &= ~(flag);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_collisions
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool BulletSoftBodyConfig::
|
||||
get_collision_flag(CollisionFlag flag) const {
|
||||
|
||||
return (_cfg.collisions & flag) ? true : false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::set_aero_model
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void BulletSoftBodyConfig::
|
||||
set_aero_model(AeroModel value) {
|
||||
|
||||
_cfg.aeromodel = (btSoftBody::eAeroModel::_)value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyConfig::get_aero_model
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletSoftBodyConfig::AeroModel BulletSoftBodyConfig::
|
||||
get_aero_model() const {
|
||||
|
||||
return (AeroModel)_cfg.aeromodel;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,115 @@
|
|||
// Filename: bulletSoftBodyConfig.h
|
||||
// Created by: enn0x (12Apr10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_SOFT_BODY_CONFIG_H__
|
||||
#define __BULLET_SOFT_BODY_CONFIG_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletSoftBodyConfig
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletSoftBodyConfig {
|
||||
|
||||
PUBLISHED:
|
||||
INLINE ~BulletSoftBodyConfig();
|
||||
|
||||
enum CollisionFlag {
|
||||
CF_rigid__vs_soft_mask = 0x000f, // RVSmask: Rigid versus soft mask
|
||||
CF_sdf_rigid_soft = 0x0001, // SDF_RS: SDF based rigid vs soft
|
||||
CF_cluster_rigid_soft = 0x0002, // CL_RS: Cluster vs convex rigid vs soft
|
||||
CF_soft_vs_soft_mask = 0x0030, // SVSmask: Soft versus soft mask
|
||||
CF_vertex_face_soft_soft = 0x0010, // VF_SS: Vertex vs face soft vs soft handling
|
||||
CF_cluster_soft_soft = 0x0020, // CL_SS: Cluster vs cluster soft vs soft handling
|
||||
CF_cluster_self = 0x0040, // CL_SELF: Cluster soft body self collision
|
||||
};
|
||||
|
||||
enum AeroModel {
|
||||
AM_vertex_point, // V_Point: Vertex normals are oriented toward velocity
|
||||
AM_vertex_two_sided, // V_TwoSided: Vertex normals are fliped to match velocity
|
||||
AM_vertex_one_sided, // V_OneSided: Vertex normals are taken as it is
|
||||
AM_face_two_sided, // F_TwoSided: Face normals are fliped to match velocity
|
||||
AM_face_one_sided, // F_OneSided: Face normals are taken as it is
|
||||
};
|
||||
|
||||
void clear_all_collision_flags();
|
||||
void set_collision_flag(CollisionFlag flag, bool value);
|
||||
bool get_collision_flag(CollisionFlag flag) const;
|
||||
|
||||
void set_aero_model(AeroModel value);
|
||||
AeroModel get_aero_model() const;
|
||||
|
||||
INLINE void set_velocities_correction_factor(float value);
|
||||
INLINE void set_damping_coefficient(float value);
|
||||
INLINE void set_drag_coefficient(float value);
|
||||
INLINE void set_lift_coefficient(float value);
|
||||
INLINE void set_pressure_coefficient(float value);
|
||||
INLINE void set_volume_conversation_coefficient(float value);
|
||||
INLINE void set_dynamic_friction_coefficient(float value);
|
||||
INLINE void set_pose_matching_coefficient(float value);
|
||||
INLINE void set_rigid_contacts_hardness(float value);
|
||||
INLINE void set_kinetic_contacts_hardness(float value);
|
||||
INLINE void set_soft_contacts_hardness(float value);
|
||||
INLINE void set_anchors_hardness(float value);
|
||||
INLINE void set_soft_vs_rigid_hardness(float value);
|
||||
INLINE void set_soft_vs_kinetic_hardness(float value);
|
||||
INLINE void set_soft_vs_soft_hardness(float value);
|
||||
INLINE void set_soft_vs_rigid_impulse_split(float value);
|
||||
INLINE void set_soft_vs_kinetic_impulse_split(float value);
|
||||
INLINE void set_soft_vs_soft_impulse_split(float value);
|
||||
INLINE void set_maxvolume(float value);
|
||||
INLINE void set_timescale(float value);
|
||||
INLINE void set_positions_solver_iterations(int value);
|
||||
INLINE void set_velocities_solver_iterations(int value);
|
||||
INLINE void set_drift_solver_iterations( int value);
|
||||
INLINE void set_cluster_solver_iterations(int value);
|
||||
|
||||
INLINE float get_velocities_correction_factor() const;
|
||||
INLINE float get_damping_coefficient() const;
|
||||
INLINE float get_drag_coefficient() const;
|
||||
INLINE float get_lift_coefficient() const;
|
||||
INLINE float get_pressure_coefficient() const;
|
||||
INLINE float get_volume_conversation_coefficient() const;
|
||||
INLINE float get_dynamic_friction_coefficient() const;
|
||||
INLINE float get_pose_matching_coefficient() const;
|
||||
INLINE float get_rigid_contacts_hardness() const;
|
||||
INLINE float get_kinetic_contacts_hardness() const;
|
||||
INLINE float get_soft_contacts_hardness() const;
|
||||
INLINE float get_anchors_hardness() const;
|
||||
INLINE float get_soft_vs_rigid_hardness() const;
|
||||
INLINE float get_soft_vs_kinetic_hardness() const;
|
||||
INLINE float get_soft_vs_soft_hardness() const;
|
||||
INLINE float get_soft_vs_rigid_impulse_split() const;
|
||||
INLINE float get_soft_vs_kinetic_impulse_split() const;
|
||||
INLINE float get_soft_vs_soft_impulse_split() const;
|
||||
INLINE float get_maxvolume() const;
|
||||
INLINE float get_timescale() const;
|
||||
INLINE int get_positions_solver_iterations() const;
|
||||
INLINE int get_velocities_solver_iterations() const;
|
||||
INLINE int get_drift_solver_iterations() const;
|
||||
INLINE int get_cluster_solver_iterations() const;
|
||||
|
||||
public:
|
||||
BulletSoftBodyConfig(btSoftBody::Config &cfg);
|
||||
|
||||
private:
|
||||
btSoftBody::Config &_cfg;
|
||||
};
|
||||
|
||||
#include "bulletSoftBodyConfig.I"
|
||||
|
||||
#endif // __BULLET_SOFT_BODY_CONFIG_H__
|
||||
|
|
@ -0,0 +1,115 @@
|
|||
// Filename: bulletSoftBodyMaterial.I
|
||||
// Created by: enn0x (19Mar11)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyMaterial::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletSoftBodyMaterial::
|
||||
~BulletSoftBodyMaterial() {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyMaterial::empty
|
||||
// Access: Published
|
||||
// Description: Named constructor intended to be used for asserts
|
||||
// with have to return a concrete value.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletSoftBodyMaterial BulletSoftBodyMaterial::
|
||||
empty() {
|
||||
|
||||
static btSoftBody::Material material;
|
||||
|
||||
return BulletSoftBodyMaterial(material);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyWorldInfo::get_material
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE btSoftBody::Material &BulletSoftBodyMaterial::
|
||||
get_material() const {
|
||||
|
||||
return _material;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyMaterial::getLinearStiffness
|
||||
// Access: Published
|
||||
// Description: Getter for the property m_kLST.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyMaterial::
|
||||
getLinearStiffness() const {
|
||||
|
||||
return _material.m_kLST;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyMaterial::setLinearStiffness
|
||||
// Access: Published
|
||||
// Description: Setter for the property m_kLST.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyMaterial::
|
||||
setLinearStiffness(float value) {
|
||||
|
||||
_material.m_kLST = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyMaterial::getAngularStiffness
|
||||
// Access: Published
|
||||
// Description: Getter for the property m_kAST.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyMaterial::
|
||||
getAngularStiffness() const {
|
||||
|
||||
return _material.m_kAST;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyMaterial::setAngularStiffness
|
||||
// Access: Published
|
||||
// Description: Setter for the property m_kAST.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyMaterial::
|
||||
setAngularStiffness(float value) {
|
||||
|
||||
_material.m_kAST = value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyMaterial::getVolumePreservation
|
||||
// Access: Published
|
||||
// Description: Getter for the property m_kVST.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyMaterial::
|
||||
getVolumePreservation() const {
|
||||
|
||||
return _material.m_kVST;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyMaterial::setVolumePreservation
|
||||
// Access: Published
|
||||
// Description: Setter for the property m_kVST.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void BulletSoftBodyMaterial::
|
||||
setVolumePreservation(float value) {
|
||||
|
||||
_material.m_kVST = value;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
// Filename: bulletSoftBodyMaterial.cxx
|
||||
// Created by: enn0x (19Mar11)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bulletSoftBodyMaterial.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyMaterial::Constructor
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
BulletSoftBodyMaterial::
|
||||
BulletSoftBodyMaterial(btSoftBody::Material &material) : _material(material) {
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
// Filename: bulletSoftBodyMaterial.h
|
||||
// Created by: enn0x (19Mar11)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_SOFT_BODY_MATERIAL_H__
|
||||
#define __BULLET_SOFT_BODY_MATERIAL_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletSoftBodyMaterial
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletSoftBodyMaterial {
|
||||
|
||||
PUBLISHED:
|
||||
INLINE ~BulletSoftBodyMaterial();
|
||||
INLINE static BulletSoftBodyMaterial empty();
|
||||
|
||||
INLINE void setLinearStiffness(float value);
|
||||
INLINE void setAngularStiffness(float value);
|
||||
INLINE void setVolumePreservation(float value);
|
||||
|
||||
INLINE float getLinearStiffness() const;
|
||||
INLINE float getAngularStiffness() const;
|
||||
INLINE float getVolumePreservation() const;
|
||||
|
||||
public:
|
||||
BulletSoftBodyMaterial(btSoftBody::Material &material);
|
||||
|
||||
INLINE btSoftBody::Material &get_material() const;
|
||||
|
||||
private:
|
||||
btSoftBody::Material &_material;
|
||||
};
|
||||
|
||||
#include "bulletSoftBodyMaterial.I"
|
||||
|
||||
#endif // __BULLET_SOFT_BODY_MATERIAL_H__
|
||||
|
|
@ -0,0 +1,116 @@
|
|||
// Filename: bulletSoftBodyNode.I
|
||||
// Created by: enn0x (27Dec10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyNode::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletSoftBodyNode::
|
||||
~BulletSoftBodyNode() {
|
||||
|
||||
delete _body;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyNodeElement::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletSoftBodyNodeElement::
|
||||
~BulletSoftBodyNodeElement() {
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyNodeElement::empty
|
||||
// Access: Published
|
||||
// Description: Named constructor intended to be used for asserts
|
||||
// with have to return a concrete value.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletSoftBodyNodeElement BulletSoftBodyNodeElement::
|
||||
empty() {
|
||||
|
||||
static btSoftBody::Node node;
|
||||
|
||||
return BulletSoftBodyNodeElement(node);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyNodeElement::get_pos
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE LPoint3f BulletSoftBodyNodeElement::
|
||||
get_pos() const {
|
||||
|
||||
return btVector3_to_LPoint3f(_node.m_x);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyNodeElement::get_normal
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE LVector3f BulletSoftBodyNodeElement::
|
||||
get_normal() const {
|
||||
|
||||
return btVector3_to_LVector3f(_node.m_n);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyNodeElement::get_velocity
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE LVector3f BulletSoftBodyNodeElement::
|
||||
get_velocity() const {
|
||||
|
||||
return btVector3_to_LVector3f(_node.m_v);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyNodeElement::get_inv_mass
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyNodeElement::
|
||||
get_inv_mass() const {
|
||||
|
||||
return _node.m_im;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyNodeElement::get_area
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float BulletSoftBodyNodeElement::
|
||||
get_area() const {
|
||||
|
||||
return _node.m_area;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyNodeElement::is_attached
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE int BulletSoftBodyNodeElement::
|
||||
is_attached() const {
|
||||
|
||||
return _node.m_battach;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,232 @@
|
|||
// Filename: bulletSoftBodyNode.h
|
||||
// Created by: enn0x (27Dec10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __BULLET_SOFT_BODY_NODE_H__
|
||||
#define __BULLET_SOFT_BODY_NODE_H__
|
||||
|
||||
#include "pandabase.h"
|
||||
|
||||
#include "bullet_includes.h"
|
||||
#include "bullet_utils.h"
|
||||
#include "bulletBodyNode.h"
|
||||
|
||||
#include "collideMask.h"
|
||||
#include "geom.h"
|
||||
#include "geomNode.h"
|
||||
#include "geomVertexFormat.h"
|
||||
#include "boundingBox.h"
|
||||
#include "nurbsCurveEvaluator.h"
|
||||
#include "nurbsSurfaceEvaluator.h"
|
||||
#include "pta_LVecBase3f.h"
|
||||
|
||||
class BulletSoftBodyConfig;
|
||||
class BulletSoftBodyMaterial;
|
||||
class BulletSoftBodyWorldInfo;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletSoftBodyNodeElement
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class BulletSoftBodyNodeElement {
|
||||
|
||||
PUBLISHED:
|
||||
INLINE ~BulletSoftBodyNodeElement();
|
||||
INLINE static BulletSoftBodyNodeElement empty();
|
||||
|
||||
INLINE LPoint3f get_pos() const;
|
||||
INLINE LVector3f get_velocity() const;
|
||||
INLINE LVector3f get_normal() const;
|
||||
INLINE float get_inv_mass() const;
|
||||
INLINE float get_area() const;
|
||||
INLINE int is_attached() const;
|
||||
|
||||
public:
|
||||
BulletSoftBodyNodeElement(btSoftBody::Node &node);
|
||||
|
||||
private:
|
||||
btSoftBody::Node &_node;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Class : BulletSoftBodyNode
|
||||
// Description :
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDABULLET BulletSoftBodyNode : public BulletBodyNode {
|
||||
|
||||
public:
|
||||
BulletSoftBodyNode(btSoftBody *body, const char *name="softbody");
|
||||
|
||||
PUBLISHED:
|
||||
INLINE ~BulletSoftBodyNode();
|
||||
|
||||
BulletSoftBodyConfig get_cfg();
|
||||
BulletSoftBodyWorldInfo get_world_info();
|
||||
|
||||
void generate_bending_constraints(int distance, BulletSoftBodyMaterial *material=NULL);
|
||||
void randomize_constraints();
|
||||
|
||||
// Mass, volume, density
|
||||
void set_volume_mass(float mass);
|
||||
void set_volume_density(float density);
|
||||
void set_total_mass(float mass, bool fromfaces=false);
|
||||
void set_total_density(float density);
|
||||
void set_mass(int node, float mass);
|
||||
|
||||
float get_mass(int node) const;
|
||||
float get_total_mass() const;
|
||||
float get_volume() const;
|
||||
|
||||
// Force
|
||||
void add_force(const LVector3f &force);
|
||||
void add_force(const LVector3f &force, int node);
|
||||
|
||||
void set_velocity(const LVector3f &velocity);
|
||||
void add_velocity(const LVector3f &velocity);
|
||||
void add_velocity(const LVector3f &velocity, int node);
|
||||
|
||||
void set_pose(bool bvolume, bool bframe);
|
||||
|
||||
BoundingBox get_aabb() const;
|
||||
|
||||
// Cluster
|
||||
void generate_clusters(int k, int maxiterations=8192);
|
||||
void release_cluster(int index);
|
||||
void release_clusters();
|
||||
int get_num_clusters() const;
|
||||
LVecBase3f cluster_com(int cluster) const;
|
||||
|
||||
// Rendering
|
||||
void link_geom(Geom *geom);
|
||||
void unlink_geom();
|
||||
|
||||
void link_curve(NurbsCurveEvaluator *curve);
|
||||
void unlink_curve();
|
||||
|
||||
void link_surface(NurbsSurfaceEvaluator *surface);
|
||||
void unlink_surface();
|
||||
|
||||
// Anchors
|
||||
void append_anchor(int node, BulletRigidBodyNode *body,
|
||||
bool disable=false);
|
||||
void append_anchor(int node, BulletRigidBodyNode *body,
|
||||
const LVector3f &pivot,
|
||||
bool disable=false);
|
||||
|
||||
// Materials
|
||||
int get_num_materials() const;
|
||||
BulletSoftBodyMaterial get_material(int idx) const;
|
||||
MAKE_SEQ(get_materials, get_num_materials, get_material);
|
||||
|
||||
BulletSoftBodyMaterial append_material();
|
||||
|
||||
// Nodes
|
||||
int get_num_nodes() const;
|
||||
BulletSoftBodyNodeElement get_node(int idx) const;
|
||||
MAKE_SEQ(get_nodes, get_num_nodes, get_node);
|
||||
|
||||
int get_closest_node_index(LVecBase3f point, bool local);
|
||||
|
||||
// Factory
|
||||
static PT(BulletSoftBodyNode) make_rope(
|
||||
BulletSoftBodyWorldInfo &info,
|
||||
const LPoint3f &from,
|
||||
const LPoint3f &to,
|
||||
int res,
|
||||
int fixeds);
|
||||
|
||||
static PT(BulletSoftBodyNode) make_patch(
|
||||
BulletSoftBodyWorldInfo &info,
|
||||
const LPoint3f &corner00,
|
||||
const LPoint3f &corner10,
|
||||
const LPoint3f &corner01,
|
||||
const LPoint3f &corner11,
|
||||
int resx,
|
||||
int resy,
|
||||
int fixeds,
|
||||
bool gendiags);
|
||||
|
||||
static PT(BulletSoftBodyNode) make_ellipsoid(
|
||||
BulletSoftBodyWorldInfo &info,
|
||||
const LPoint3f ¢er,
|
||||
const LVecBase3f &radius,
|
||||
int res);
|
||||
|
||||
static PT(BulletSoftBodyNode) make_tri_mesh(
|
||||
BulletSoftBodyWorldInfo &info,
|
||||
const Geom *geom,
|
||||
bool randomizeConstraints=true);
|
||||
|
||||
static PT(BulletSoftBodyNode) make_tri_mesh(
|
||||
BulletSoftBodyWorldInfo &info,
|
||||
PTA_LVecBase3f points,
|
||||
PTA_int indices,
|
||||
bool randomizeConstraints=true);
|
||||
|
||||
static PT(BulletSoftBodyNode) make_tet_mesh(
|
||||
BulletSoftBodyWorldInfo &info,
|
||||
PTA_LVecBase3f points,
|
||||
PTA_int indices,
|
||||
bool tetralinks=true);
|
||||
|
||||
static PT(BulletSoftBodyNode) make_tet_mesh(
|
||||
BulletSoftBodyWorldInfo &info,
|
||||
const char *ele,
|
||||
const char *face,
|
||||
const char *node);
|
||||
|
||||
public:
|
||||
virtual btCollisionObject *get_object() const;
|
||||
|
||||
void post_step();
|
||||
|
||||
protected:
|
||||
virtual void parents_changed();
|
||||
virtual void transform_changed();
|
||||
|
||||
private:
|
||||
btSoftBody *_body;
|
||||
|
||||
PT(Geom) _geom;
|
||||
PT(NurbsCurveEvaluator) _curve;
|
||||
PT(NurbsSurfaceEvaluator) _surface;
|
||||
|
||||
static int get_point_index(LVecBase3f p, PTA_LVecBase3f points);
|
||||
static int next_line(const char *buffer);
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
static void init_type() {
|
||||
BulletBodyNode::init_type();
|
||||
register_type(_type_handle, "BulletSoftBodyNode",
|
||||
BulletBodyNode::get_class_type());
|
||||
}
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
virtual TypeHandle force_init_type() {
|
||||
init_type();
|
||||
return get_class_type();
|
||||
}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "bulletSoftBodyNode.I"
|
||||
|
||||
#endif // __BULLET_SOFT_BODY_NODE_H__
|
||||
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
// Filename: bulletSoftBodyShape.I
|
||||
// Created by: enn0x (06May10)
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||
//
|
||||
// All use of this software is subject to the terms of the revised BSD
|
||||
// license. You should have received a copy of this license along
|
||||
// with this source code in a file named "LICENSE."
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: BulletSoftBodyShape::Destructor
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE BulletSoftBodyShape::
|
||||
~BulletSoftBodyShape() {
|
||||
|
||||
// The btSoftBodyShape _shape is created and deleted internally
|
||||
// by the owning btSoftBody object. It must not be deleted
|
||||
// here!
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue