Moving to PhysX SDK 2.8.4 (win only), and added first experimental SoftBody code.

This commit is contained in:
enn0x 2010-10-17 08:09:48 +00:00
parent ccdae0e4bc
commit e2093b1c2d
37 changed files with 3499 additions and 32 deletions

View File

@ -707,9 +707,9 @@ def CompileCxx(obj,src,opts):
cmd += "/wd4996 /wd4275 /wd4267 /wd4101 /wd4273 "
# Enables Windows 7 mode if SDK is detected.
platsdk = GetRegistryKey("SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.0", "InstallationFolder")
if platsdk and os.path.isdir(platsdk):
cmd += "/DPANDA_WIN7 /DWINVER=0x601 "
#platsdk = GetRegistryKey("SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.0", "InstallationFolder")
#if platsdk and os.path.isdir(platsdk):
# cmd += "/DPANDA_WIN7 /DWINVER=0x601 "
cmd += "/Fo" + obj + " /nologo /c"
for x in ipath: cmd += " /I" + x

View File

@ -1469,6 +1469,7 @@ def SdkLocateMacOSX(osxtarget=None):
PHYSXVERSIONINFO=[
("PHYSX281","v2.8.1"),
("PHYSX283","v2.8.3"),
("PHYSX284","v2.8.4"),
]
def SdkLocatePhysX():
@ -1476,7 +1477,8 @@ def SdkLocatePhysX():
if (sys.platform == "win32"):
folders = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Folders"
for folder in ListRegistryValues(folders):
if folder.endswith("NVIDIA PhysX SDK\\%s\\SDKs\\" % key):
if folder.endswith("NVIDIA PhysX SDK\\%s\\SDKs\\" % key) or \
folder.endswith("NVIDIA PhysX SDK\\%s_win\\SDKs\\" % key):
SDK["PHYSX"] = folder
SDK["PHYSXVERSION"] = ver
elif (sys.platform.startswith("linux")):

View File

@ -84,6 +84,7 @@
physxMemoryReadBuffer.h \
physxMemoryWriteBuffer.h \
physxMeshPool.I physxMeshPool.h \
physxMeshHash.I physxMeshHash.h \
physxMotorDesc.I physxMotorDesc.h \
physxObject.I physxObject.h \
physxObjectCollection.I physxObjectCollection.h \
@ -110,6 +111,11 @@
physxSegment.I physxSegment.h \
physxShape.I physxShape.h \
physxShapeDesc.I physxShapeDesc.h \
physxSoftBody.I physxSoftBody.h \
physxSoftBodyDesc.I physxSoftBodyDesc.h \
physxSoftMeshBody.I physxSoftMeshBody.h \
physxSoftBodyMeshDesc.I physxSoftBodyMeshDesc.h \
physxSoftBodyNode.I physxSoftBodyNode.h \
physxSphere.I physxSphere.h \
physxSphereForceFieldShape.I physxSphereForceFieldShape.h \
physxSphereForceFieldShapeDesc.I physxSphereForceFieldShapeDesc.h \
@ -205,6 +211,7 @@
physxMemoryReadBuffer.cxx \
physxMemoryWriteBuffer.cxx \
physxMeshPool.cxx \
physxMeshHash.cxx \
physxMotorDesc.cxx \
physxObject.cxx \
physxObjectCollection.cxx \
@ -231,6 +238,11 @@
physxSegment.cxx \
physxShape.cxx \
physxShapeDesc.cxx \
physxSoftBody.cxx \
physxSoftBodyDesc.cxx \
physxSoftMeshBody.cxx \
physxSoftBodyMeshDesc.cxx \
physxSoftBodyNode.cxx \
physxSphere.cxx \
physxSphereForceFieldShape.cxx \
physxSphereForceFieldShapeDesc.cxx \
@ -326,6 +338,7 @@
physxMemoryReadBuffer.h \
physxMemoryWriteBuffer.h \
physxMeshPool.I physxMeshPool.h \
physxMeshHash.I physxMeshHash.h \
physxMotorDesc.I physxMotorDesc.h \
physxObject.I physxObject.h \
physxObjectCollection.I physxObjectCollection.h \
@ -352,6 +365,11 @@
physxSegment.I physxSegment.h \
physxShape.I physxShape.h \
physxShapeDesc.I physxShapeDesc.h \
physxSoftBody.I physxSoftBody.h \
physxSoftBodyDesc.I physxSoftBodyDesc.h \
physxSoftMeshBody.I physxSoftMeshBody.h \
physxSoftBodyMeshDesc.I physxSoftBodyMeshDesc.h \
physxSoftBodyNode.I physxSoftBodyNode.h \
physxSphere.I physxSphere.h \
physxSphereForceFieldShape.I physxSphereForceFieldShape.h \
physxSphereForceFieldShapeDesc.I physxSphereForceFieldShapeDesc.h \

View File

@ -52,6 +52,9 @@
#include "physxRevoluteJoint.h"
#include "physxScene.h"
#include "physxShape.h"
#include "physxSoftBody.h"
#include "physxSoftBodyMesh.h"
#include "physxSoftBodyNode.h"
#include "physxSphereForceFieldShape.h"
#include "physxSphereShape.h"
#include "physxSphericalJoint.h"
@ -150,6 +153,9 @@ init_libphysx() {
PhysxRevoluteJoint::init_type();
PhysxScene::init_type();
PhysxShape::init_type();
PhysxSoftBody::init_type();
PhysxSoftBodyMesh::init_type();
PhysxSoftBodyNode::init_type();
PhysxSphereForceFieldShape::init_type();
PhysxSphereShape::init_type();
PhysxSphericalJoint::init_type();

View File

@ -83,16 +83,19 @@ release() {
void PhysxCloth::
update() {
// Update node mesh data
_node->update();
if (_node) {
// Update node bounding volume
NxBounds3 bounds;
_ptr->getWorldBounds(bounds);
// Update node mesh data
_node->update();
BoundingBox bb(PhysxManager::nxVec3_to_point3(bounds.min),
PhysxManager::nxVec3_to_point3(bounds.max));
_node->set_bounds(&bb);
// Update node bounding volume
NxBounds3 bounds;
_ptr->getWorldBounds(bounds);
BoundingBox bb(PhysxManager::nxVec3_to_point3(bounds.min),
PhysxManager::nxVec3_to_point3(bounds.max));
_node->set_bounds(&bb);
}
}
////////////////////////////////////////////////////////////////////
@ -200,7 +203,7 @@ void PhysxCloth::
set_thickness(float thickness) {
nassertv(_error_type == ET_ok);
_ptr->setFriction(thickness);
_ptr->setThickness(thickness);
}
////////////////////////////////////////////////////////////////////

View File

@ -107,10 +107,10 @@
#define NX_FORCE_FIELD_CUSTOM_KERNEL_EPSILON 97
#define NX_IMPROVED_SPRING_SOLVER 98
#ifdef PHYSX283
#ifndef PHYSX281
#define NX_FAST_MASSIVE_BP_VOLUME_DELETION 99
#define NX_LEGACY_JOINT_DRIVE 100
#endif /* PHYSX283 */
#endif /* PHYSX281 */
// PhysxActorFlag
#define NX_AF_DISABLE_COLLISION 1<<0
@ -297,6 +297,23 @@
#define NX_DYNAMIC_SHAPES 1<<1
#define NX_ALL_SHAPES (1<<0|1<<1)
// PhysxSoftBodyFlag
#define NX_SBF_STATIC 1<<1
#define NX_SBF_DISABLE_COLLISION 1<<2
#define NX_SBF_SELFCOLLISION 1<<3
#define NX_SBF_VISUALIZATION 1<<4
#define NX_SBF_GRAVITY 1<<5
#define NX_SBF_VOLUME_CONSERVATION 1<<6
#define NX_SBF_DAMPING 1<<7
#define NX_SBF_COLLISION_TWOWAY 1<<8
#define NX_SBF_TEARABLE 1<<9
#define NX_SBF_HARDWARE 1<<10
#define NX_SBF_COMDAMPING 1<<11
#define NX_SBF_VALIDBOUNDS 1<<12
#define NX_SBF_FLUID_COLLISION 1<<13
#define NX_SBF_DISABLE_DYNAMIC_CCD 1<<14
#define NX_SBF_ADHERE 1<<15
// PhysxSphericalJointFlag
#define NX_SJF_TWIST_LIMIT_ENABLED 1<<0
#define NX_SJF_SWING_LIMIT_ENABLED 1<<1
@ -634,6 +651,24 @@ PUBLISHED:
SF_softbody_twoway = NX_SF_SOFTBODY_TWOWAY
};
enum PhysxSoftBodyFlag {
SBF_static = NX_SBF_STATIC,
SBF_disable_collision = NX_SBF_DISABLE_COLLISION,
SBF_selfcollision = NX_SBF_SELFCOLLISION,
SBF_visualization = NX_SBF_VISUALIZATION,
SBF_gravity = NX_SBF_GRAVITY,
SBF_volume_conservtion = NX_SBF_VOLUME_CONSERVATION,
SBF_damping = NX_SBF_DAMPING,
SBF_collision_twoway = NX_SBF_COLLISION_TWOWAY,
SBF_tearable = NX_SBF_TEARABLE,
SBF_hardware = NX_SBF_HARDWARE,
SBF_comdamping = NX_SBF_COMDAMPING,
SBF_validbounds = NX_SBF_VALIDBOUNDS,
SBF_fluid_collision = NX_SBF_FLUID_COLLISION,
SBF_disable_dynamic_ccd = NX_SBF_DISABLE_DYNAMIC_CCD,
SBF_adhere = NX_SBF_ADHERE
};
enum PhysxShapesType {
ST_static = NX_STATIC_SHAPES ,
ST_dynamic = NX_DYNAMIC_SHAPES ,

View File

@ -22,6 +22,8 @@
#include "physxMemoryWriteBuffer.h"
#include "physxClothMesh.h"
#include "physxClothMeshDesc.h"
#include "physxSoftBodyMesh.h"
#include "physxSoftBodyMeshDesc.h"
////////////////////////////////////////////////////////////////////
// Function: PhysxKitchen::set_cooking_params
@ -101,6 +103,22 @@ cook_cloth_mesh(const PhysxClothMeshDesc &meshDesc, const Filename &filename) {
return _cooking->NxCookClothMesh(meshDesc.get_desc(), fs);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxKitchen::cook_soft_body_mesh
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
bool PhysxKitchen::
cook_soft_body_mesh(const PhysxSoftBodyMeshDesc &meshDesc, const Filename &filename) {
nassertr_always(!filename.empty(), false);
nassertr_always(filename.touch(), false);
nassertr_always(meshDesc.is_valid(), false);
PhysxFileStream fs = PhysxFileStream(filename, false);
return _cooking->NxCookSoftBodyMesh(meshDesc.get_desc(), fs);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxKitchen::cook_texcoords
// Access: Published
@ -229,3 +247,32 @@ cook_cloth_mesh(const PhysxClothMeshDesc &meshDesc) {
return mesh;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxKitchen::cook_soft_body_mesh
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
PhysxSoftBodyMesh *PhysxKitchen::
cook_soft_body_mesh(const PhysxSoftBodyMeshDesc &meshDesc) {
nassertr_always(meshDesc.is_valid(), false);
PhysxMemoryWriteBuffer wbuffer;
bool status = _cooking->NxCookSoftBodyMesh(meshDesc.get_desc(), wbuffer);
nassertr(status, NULL);
NxPhysicsSDK *sdk = NxGetPhysicsSDK();
nassertr(sdk, NULL);
PhysxSoftBodyMesh *mesh = new PhysxSoftBodyMesh();
nassertr(mesh, NULL);
PhysxMemoryReadBuffer rbuffer(wbuffer.data);
NxSoftBodyMesh *meshPtr = sdk->createSoftBodyMesh(rbuffer);
nassertr(meshPtr, NULL);
mesh->link(meshPtr);
return mesh;
}

View File

@ -26,6 +26,8 @@ class PhysxTriangleMesh;
class PhysxTriangleMeshDesc;
class PhysxClothMesh;
class PhysxClothMeshDesc;
class PhysxSoftBodyMesh;
class PhysxSoftBodyMeshDesc;
////////////////////////////////////////////////////////////////////
// Class : PhysxKitchen
@ -42,11 +44,13 @@ PUBLISHED:
bool cook_convex_mesh(const PhysxConvexMeshDesc &meshDesc, const Filename &filename);
bool cook_triangle_mesh(const PhysxTriangleMeshDesc &meshDesc, const Filename &filename);
bool cook_cloth_mesh(const PhysxClothMeshDesc &meshDesc, const Filename &filename);
bool cook_soft_body_mesh(const PhysxSoftBodyMeshDesc &meshDesc, const Filename &filename);
bool cook_texcoords(const PhysxClothMeshDesc &meshDesc, const Filename &filename);
PhysxConvexMesh *cook_convex_mesh(const PhysxConvexMeshDesc &meshDesc);
PhysxTriangleMesh *cook_triangle_mesh(const PhysxTriangleMeshDesc &meshDesc);
PhysxClothMesh *cook_cloth_mesh(const PhysxClothMeshDesc &meshDesc);
PhysxSoftBodyMesh *cook_soft_body_mesh(const PhysxSoftBodyMeshDesc &meshDesc);
private:
NxCookingInterface *_cooking;

View File

@ -295,6 +295,30 @@ get_cloth_mesh(unsigned int idx) {
return (PhysxClothMesh *)_cloth_meshes[idx];
}
////////////////////////////////////////////////////////////////////
// Function: PhysxManager::get_num_soft_body_meshes
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
unsigned int PhysxManager::
get_num_soft_body_meshes() {
return _sdk->getNbSoftBodyMeshes();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxManager::get_soft_body_mesh
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
PhysxSoftBodyMesh *PhysxManager::
get_soft_body_mesh(unsigned int idx) {
nassertr_always(idx < _sdk->getNbSoftBodyMeshes(), NULL);
return (PhysxSoftBodyMesh *)_softbody_meshes[idx];
}
////////////////////////////////////////////////////////////////////
// Function: PhysxManager::is_hardware_available
// Access: Published

View File

@ -27,6 +27,11 @@ class PhysxScene;
class PhysxSceneDesc;
class PhysxHeightField;
class PhysxHeightFieldDesc;
class PhysxTriangleMesh;
class PhysxConvexMesh;
class PhysxClothMesh;
class PhysxSoftBodyMesh;
class PhysxOutputStream;
////////////////////////////////////////////////////////////////////
// Class : PhysxManager
@ -75,6 +80,10 @@ PUBLISHED:
PhysxClothMesh *get_cloth_mesh(unsigned int idx);
MAKE_SEQ(get_cloth_meshes, get_num_cloth_meshes, get_cloth_mesh);
unsigned int get_num_soft_body_meshes();
PhysxSoftBodyMesh *get_soft_body_mesh(unsigned int idx);
MAKE_SEQ(get_soft_body_meshes, get_num_soft_body_meshes, get_soft_body_mesh);
INLINE void ls() const;
INLINE void ls(ostream &out, int indent_level=0) const;
@ -86,6 +95,7 @@ public:
PhysxObjectCollection<PhysxConvexMesh> _convex_meshes;
PhysxObjectCollection<PhysxTriangleMesh> _triangle_meshes;
PhysxObjectCollection<PhysxClothMesh> _cloth_meshes;
PhysxObjectCollection<PhysxSoftBodyMesh> _softbody_meshes;
INLINE static NxVec3 vec3_to_nxVec3(const LVector3f &v);
INLINE static LVector3f nxVec3_to_vec3(const NxVec3 &v);

View File

@ -0,0 +1,84 @@
// Filename: physMeshHash.I
// Created by: enn0x (13Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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: PhysxMeshHash::Constructor
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
INLINE PhysxMeshHash::
PhysxMeshHash() {
_time = 1;
MeshHashRoot *r = _hashIndex;
for (int i=0; i < _hashIndexSize; i++) {
r->first = -1;
r->timeStamp = 0;
r++;
}
_spacing = 0.25f;
_invSpacing = 1.0f / _spacing;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::Destructor
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
INLINE PhysxMeshHash::
~PhysxMeshHash() {
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::hash_function
// Access: Private
// Description:
////////////////////////////////////////////////////////////////////
INLINE int PhysxMeshHash::
hash_function(int xi, int yi, int zi) const {
unsigned int h = (xi * 92837111)^(yi * 689287499)^(zi * 283923481);
return h % _hashIndexSize;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::cell_coord_of
// Access: Private
// Description:
////////////////////////////////////////////////////////////////////
INLINE void PhysxMeshHash::
cell_coord_of(const NxVec3 &v, int &xi, int &yi, int &zi) const {
xi = (int)(v.x * _invSpacing); if (v.x < 0.0f) xi--;
yi = (int)(v.y * _invSpacing); if (v.y < 0.0f) yi--;
zi = (int)(v.z * _invSpacing); if (v.z < 0.0f) zi--;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::get_grid_spacing
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
INLINE NxF32 PhysxMeshHash::
get_grid_spacing() const {
return 1.0f / _invSpacing;
}

View File

@ -0,0 +1,263 @@
// Filename: physxMeshHash.cxx
// Created by: enn0x (13Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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 "physxMeshHash.h"
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::quick_sort
// Access: Private
// Description:
////////////////////////////////////////////////////////////////////
void PhysxMeshHash::
quick_sort(pvector<int> &itemIndices, int l, int r) {
int i, j, mi;
int k, m;
i = l; j = r; mi = (l + r)/2;
m = itemIndices[mi];
while (i <= j) {
while(itemIndices[i] < m) i++;
while(m < itemIndices[j]) j--;
if (i <= j) {
k = itemIndices[i]; itemIndices[i] = itemIndices[j]; itemIndices[j] = k;
i++; j--;
}
}
if (l < j) quick_sort(itemIndices, l, j);
if (i < r) quick_sort(itemIndices, i, r);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::compress_indices
// Access: Private
// Description:
////////////////////////////////////////////////////////////////////
void PhysxMeshHash::
compress_indices(pvector<int> &itemIndices) {
if (itemIndices.size() == 0) return;
// Sort results
quick_sort(itemIndices, 0, itemIndices.size() - 1);
// Mark duplicates
int i = 0;
while (i < (int)itemIndices.size()) {
int j = i+1;
while (j < (int)itemIndices.size() && itemIndices[i] == itemIndices[j]) {
itemIndices[j] = -1; j++;
}
i = j;
}
// Remove duplicates
i = 0;
while (i < (int)itemIndices.size()) {
if (itemIndices[i] < 0) {
itemIndices[i] = itemIndices[itemIndices.size()-1];
itemIndices.pop_back();
}
else i++;
}
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::set_grid_spacing
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxMeshHash::
set_grid_spacing(float spacing) {
_spacing = spacing;
_invSpacing = 1.0f / spacing;
reset();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::reset
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxMeshHash::
reset() {
_time++;
_entries.clear();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::add
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxMeshHash::
add(const NxBounds3 &bounds, int itemIndex) {
int x1,y1,z1;
int x2,y2,z2;
int x,y,z;
cell_coord_of(bounds.min, x1, y1, z1);
cell_coord_of(bounds.max, x2, y2, z2);
MeshHashEntry entry;
entry.itemIndex = itemIndex;
for (x = x1; x <= x2; x++) {
for (y = y1; y <= y2; y++) {
for (z = z1; z <= z2; z++) {
int h = hash_function(x, y, z);
MeshHashRoot &r = _hashIndex[h];
int n = _entries.size();
if (r.timeStamp != _time || r.first < 0)
entry.next = -1;
else
entry.next = r.first;
r.first = n;
r.timeStamp = _time;
_entries.push_back(entry);
}
}
}
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::add
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxMeshHash::
add(const NxVec3 &pos, int itemIndex) {
int x, y, z;
cell_coord_of(pos, x, y, z);
MeshHashEntry entry;
entry.itemIndex = itemIndex;
int h = hash_function(x, y, z);
MeshHashRoot &r = _hashIndex[h];
int n = _entries.size();
if (r.timeStamp != _time || r.first < 0)
entry.next = -1;
else
entry.next = r.first;
r.first = n;
r.timeStamp = _time;
_entries.push_back(entry);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::query
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxMeshHash::
query(const NxBounds3 &bounds, pvector<int> &itemIndices, int maxIndices) {
int x1, y1, z1;
int x2, y2, z2;
int x, y, z;
cell_coord_of(bounds.min, x1, y1, z1);
cell_coord_of(bounds.max, x2, y2, z2);
itemIndices.clear();
for (x=x1; x<=x2; x++) {
for (y=y1; y<=y2; y++) {
for (z=z1; z<=z2; z++) {
int h = hash_function(x, y, z);
MeshHashRoot &r = _hashIndex[h];
if (r.timeStamp != _time) continue;
int i = r.first;
while (i >= 0) {
MeshHashEntry &entry = _entries[i];
itemIndices.push_back(entry.itemIndex);
if (maxIndices >= 0 && (int)itemIndices.size() >= maxIndices) return;
i = entry.next;
}
}
}
}
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::query_unique
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxMeshHash::
query_unique(const NxBounds3 &bounds, pvector<int> &itemIndices, int maxIndices) {
query(bounds, itemIndices, maxIndices);
compress_indices(itemIndices);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::query
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxMeshHash::
query(const NxVec3 &pos, pvector<int> &itemIndices, int maxIndices) {
int x, y, z;
cell_coord_of(pos, x, y, z);
itemIndices.clear();
int h = hash_function(x, y, z);
MeshHashRoot &r = _hashIndex[h];
if (r.timeStamp != _time) return;
int i = r.first;
while (i >= 0) {
MeshHashEntry &entry = _entries[i];
itemIndices.push_back(entry.itemIndex);
if (maxIndices >= 0 && (int)itemIndices.size() >= maxIndices) return;
i = entry.next;
}
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshHash::query_unique
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxMeshHash::
query_unique(const NxVec3 &pos, pvector<int> &itemIndices, int maxIndices) {
query(pos, itemIndices, maxIndices);
compress_indices(itemIndices);
}

View File

@ -0,0 +1,78 @@
// Filename: physMeshHash.h
// Created by: enn0x (13Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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 PHYSXMESHHASH_H
#define PHYSXMESHHASH_H
#include "config_physx.h"
#include "pvector.h"
////////////////////////////////////////////////////////////////////
// Class : PhysxMeshHash
// Description : Utility class used in building links between a
// tetrahedron mesh (soft body) and a triangle mesh
// used for rendering the soft body.
////////////////////////////////////////////////////////////////////
class PhysxMeshHash {
public:
PhysxMeshHash();
~PhysxMeshHash();
void reset();
void set_grid_spacing(float spacing);
INLINE NxF32 get_grid_spacing() const;
void add(const NxBounds3 &bounds, int itemIndex);
void add(const NxVec3 &pos, int itemIndex);
void query(const NxBounds3 &bounds, pvector<int> &itemIndices, int maxIndices=-1);
void query_unique(const NxBounds3 &bounds, pvector<int> &itemIndices, int maxIndices=-1);
void query(const NxVec3 &pos, pvector<int> &itemIndices, int maxIndices=-1);
void query_unique(const NxVec3 &pos, pvector<int> &itemIndices, int maxIndices=-1);
private:
struct MeshHashRoot {
int first;
int timeStamp;
};
struct MeshHashEntry {
int itemIndex;
int next;
};
NxI32 _time;
NxF32 _spacing;
NxF32 _invSpacing;
static const int _hashIndexSize = 17011;
MeshHashRoot _hashIndex[_hashIndexSize];
pvector<MeshHashEntry> _entries;
INLINE int hash_function(int xi, int yi, int zi) const;
INLINE void cell_coord_of(const NxVec3 &v, int &xi, int &yi, int &zi) const;
void compress_indices(pvector<int> &itemIndices);
void quick_sort(pvector<int> &itemIndices, int l, int r);
};
#include "physxMeshHash.I"
#endif // PHYSXMESHHASH_H

View File

@ -16,6 +16,7 @@
#include "physxConvexMesh.h"
#include "physxTriangleMesh.h"
#include "physxClothMesh.h"
#include "physxSoftBodyMesh.h"
#include "physxFileStream.h"
#include "virtualFileSystem.h"
@ -23,7 +24,7 @@
PhysxMeshPool::ConvexMeshes PhysxMeshPool::_convex_meshes;
PhysxMeshPool::TriangleMeshes PhysxMeshPool::_triangle_meshes;
PhysxMeshPool::ClothMeshes PhysxMeshPool::_cloth_meshes;
//PhysxMeshPool::SoftbodyMeshes PhysxMeshPool::_softbody_meshes;
PhysxMeshPool::SoftbodyMeshes PhysxMeshPool::_softbody_meshes;
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshPool::check_file
@ -163,6 +164,45 @@ load_cloth_mesh(const Filename &fn) {
return mesh;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshPool::load_soft_body_mesh
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
PhysxSoftBodyMesh *PhysxMeshPool::
load_soft_body_mesh(const Filename &fn) {
if (!check_filename(fn)) return NULL;
PhysxSoftBodyMesh *mesh;
SoftbodyMeshes::iterator it = _softbody_meshes.find(fn);
if (it == _softbody_meshes.end()) {
// Not found; load mesh.
NxSoftBodyMesh *meshPtr;
PhysxFileStream stream = PhysxFileStream(fn, true);
mesh = new PhysxSoftBodyMesh();
nassertr_always(mesh, NULL);
NxPhysicsSDK *sdk = NxGetPhysicsSDK();
nassertr_always(sdk, NULL);
meshPtr = sdk->createSoftBodyMesh(stream);
nassertr_always(meshPtr, NULL);
mesh->link(meshPtr);
_softbody_meshes.insert(SoftbodyMeshes::value_type(fn, mesh));
}
else {
// Found; return previously loaded mesh.
mesh = (*it).second;
}
return mesh;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshPool::release_convex_mesh
// Access: Published
@ -220,6 +260,25 @@ release_cloth_mesh(PhysxClothMesh *mesh) {
return false;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshPool::release_soft_body_mesh
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
bool PhysxMeshPool::
release_soft_body_mesh(PhysxSoftBodyMesh *mesh) {
SoftbodyMeshes::iterator it;
for (it=_softbody_meshes.begin(); it != _softbody_meshes.end(); ++it) {
if (mesh == (*it).second) {
_softbody_meshes.erase(it);
return true;
}
}
return false;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxMeshPool::list_content
// Access: Published
@ -279,6 +338,19 @@ list_contents(ostream &out) {
}
}
// Soft body meshes
{
SoftbodyMeshes::const_iterator it;
for (it=_softbody_meshes.begin(); it != _softbody_meshes.end(); ++it) {
Filename fn = (*it).first;
PhysxSoftBodyMesh *mesh = (*it).second;
out << " " << fn.get_fullpath()
<< " (soft body mesh, " << mesh->ptr()->getReferenceCount()
<< " references)\n";
}
}
// Summary
NxPhysicsSDK *sdk = NxGetPhysicsSDK();
@ -290,5 +362,8 @@ list_contents(ostream &out) {
out << " Total number of cloth meshes: " << sdk->getNbClothMeshes()
<< " created, " << _cloth_meshes.size() << " registred\n";
out << " Total number of soft body meshes: " << sdk->getNbSoftBodyMeshes()
<< " created, " << _softbody_meshes.size() << " registred\n";
}

View File

@ -26,6 +26,7 @@
class PhysxConvexMesh;
class PhysxTriangleMesh;
class PhysxClothMesh;
class PhysxSoftBodyMesh;
////////////////////////////////////////////////////////////////////
// Class : PhysxMeshPool
@ -44,12 +45,12 @@ PUBLISHED:
static PhysxConvexMesh *load_convex_mesh(const Filename &filename);
static PhysxTriangleMesh *load_triangle_mesh(const Filename &filename);
static PhysxClothMesh *load_cloth_mesh(const Filename &filename);
//static PhysxSoftBodyMesh *load_softbody_mesh(const Filename &filename);
static PhysxSoftBodyMesh *load_soft_body_mesh(const Filename &filename);
static bool release_convex_mesh(PhysxConvexMesh *mesh);
static bool release_triangle_mesh(PhysxTriangleMesh *mesh);
static bool release_cloth_mesh(PhysxClothMesh *mesh);
//static bool release_softbody_mesh(PhysxSoftBodyMesh *mesh);
static bool release_soft_body_mesh(PhysxSoftBodyMesh *mesh);
static void list_contents();
static void list_contents(ostream &out);
@ -66,8 +67,8 @@ private:
typedef pmap<Filename, PT(PhysxClothMesh)> ClothMeshes;
static ClothMeshes _cloth_meshes;
//typedef pmap<Filename, PT(PhysxSoftBodyMesh)> SoftbodyMeshes;
//static SoftbodyMeshes _softbody_meshes;
typedef pmap<Filename, PT(PhysxSoftBodyMesh)> SoftbodyMeshes;
static SoftbodyMeshes _softbody_meshes;
};
#include "physxMeshPool.I"

View File

@ -66,6 +66,6 @@ ls(ostream &out, int indent_level) const {
_controllers.ls(out, indent_level);
_vehicles.ls(out, indent_level);
_cloths.ls(out, indent_level);
//_softbodies.ls(out, indent_level);
_softbodies.ls(out, indent_level);
}

View File

@ -24,6 +24,8 @@
#include "physxVehicleDesc.h"
#include "physxCloth.h"
#include "physxClothDesc.h"
#include "physxSoftBody.h"
#include "physxSoftBodyDesc.h"
TypeHandle PhysxScene::_type_handle;
@ -32,7 +34,7 @@ PStatCollector PhysxScene::_pcollector_update_transforms("App:PhysX:Update Trans
PStatCollector PhysxScene::_pcollector_debug_renderer("App:PhysX:Debug Renderer");
PStatCollector PhysxScene::_pcollector_simulate("App:PhysX:Simulate");
PStatCollector PhysxScene::_pcollector_cloth("App:PhysX:Cloth");
//PStatCollector PhysxScene::_pcollector_softbody("App:PhysX:Softbody");
PStatCollector PhysxScene::_pcollector_softbody("App:PhysX:Softbody");
////////////////////////////////////////////////////////////////////
// Function: PhysxScene::link
@ -137,15 +139,13 @@ unlink() {
}
// Unlink softbodies
/*
NxSoftBody **sbs = _ptr->getSoftBodies();
NxU32 nSbs = _ptr->getNbSoftBodies();
NxSoftBody **softbodies = _ptr->getSoftBodies();
NxU32 nSoftbodies = _ptr->getNbSoftBodies();
for (NxU32 i=0; i < nSbs; i++) {
PhysxSoftBody *sb = (PhysxSoftBody *)sb[i]->userData;
sb->unlink();
for (NxU32 i=0; i < nSoftbodies; i++) {
PhysxSoftBody *softbody = (PhysxSoftBody *)softbodies[i]->userData;
softbody->unlink();
}
*/
// Unlink materials
NxMaterial *materials[5];
@ -241,6 +241,12 @@ simulate(float dt) {
void PhysxScene::
fetch_results() {
#ifdef NX64
cout << "<64bit>";
#else
cout << "<32bit>";
#endif
nassertv(_error_type == ET_ok);
nassertv(_ptr != NULL);
@ -288,15 +294,15 @@ fetch_results() {
_pcollector_cloth.stop();
// Update softbody nodes
/*
_pcollector_softbody.start();
NxSoftBody **softbodies = _ptr->getSoftBodies();
for (NxU32 i=0; i < _ptr->getNbSoftBodies(); i++) {
PT(PhysxSoftBody) softbody = (PhysxSoftBody *)softbodies[i]->userData;
softbody->update();
}
_pcollector_softbody.stop();
*/
}
////////////////////////////////////////////////////////////////////
@ -951,6 +957,57 @@ get_cloth(unsigned int idx) const {
return (PhysxCloth *)(clothPtr->userData);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxScene::get_num_soft_bodies
// Access: Published
// Description: Gets the number of soft bodies in the scene.
////////////////////////////////////////////////////////////////////
unsigned int PhysxScene::
get_num_soft_bodies() const {
nassertr(_error_type == ET_ok, -1);
return _ptr->getNbSoftBodies();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxScene::create_soft_body
// Access: Published
// Description: Creates a soft body in this scene.
////////////////////////////////////////////////////////////////////
PhysxSoftBody *PhysxScene::
create_soft_body(PhysxSoftBodyDesc &desc) {
nassertr(_error_type == ET_ok, NULL);
PhysxSoftBody *softbody = new PhysxSoftBody();
nassertr(softbody, NULL);
NxSoftBody *softbodyPtr = _ptr->createSoftBody(desc._desc);
nassertr(softbodyPtr, NULL);
softbody->link(softbodyPtr);
return softbody;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxScene::get_soft_body
// Access: Published
// Description: Returns the n-th soft body from the array of
// all the soft bodies in the scene.
////////////////////////////////////////////////////////////////////
PhysxSoftBody *PhysxScene::
get_soft_body(unsigned int idx) const {
nassertr(_error_type == ET_ok, NULL);
nassertr_always(idx < _ptr->getNbSoftBodies(), NULL);
NxSoftBody **softbodies = _ptr->getSoftBodies();
NxSoftBody *softbodyPtr = softbodies[idx];
return (PhysxSoftBody *)(softbodyPtr->userData);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxScene::get_num_vehicles
// Access: Published

View File

@ -52,6 +52,8 @@ class PhysxVehicle;
class PhysxVehicleDesc;
class PhysxCloth;
class PhysxClothDesc;
class PhysxSoftBody;
class PhysxSoftBodyDesc;
////////////////////////////////////////////////////////////////////
// Class : PhysxScene
@ -139,6 +141,12 @@ PUBLISHED:
PhysxCloth *get_cloth(unsigned int idx) const;
MAKE_SEQ(get_cloths, get_num_cloths, get_cloth);
// Soft bodies
unsigned int get_num_soft_bodies() const;
PhysxSoftBody *create_soft_body(PhysxSoftBodyDesc &desc);
PhysxSoftBody *get_soft_body(unsigned int idx) const;
MAKE_SEQ(get_soft_bodies, get_num_soft_bodies, get_soft_body);
// Vehicles
unsigned int get_num_vehicles() const;
PhysxVehicle *create_vehicle(PhysxVehicleDesc &desc);
@ -230,6 +238,7 @@ public:
PhysxObjectCollection<PhysxController> _controllers;
PhysxObjectCollection<PhysxVehicle> _vehicles;
PhysxObjectCollection<PhysxCloth> _cloths;
PhysxObjectCollection<PhysxSoftBody> _softbodies;
PhysxMaterial *get_wheel_shape_material();
@ -248,7 +257,7 @@ private:
static PStatCollector _pcollector_debug_renderer;
static PStatCollector _pcollector_simulate;
static PStatCollector _pcollector_cloth;
//static PStatCollector _pcollector_softbody;
static PStatCollector _pcollector_softbody;
////////////////////////////////////////////////////////////////////
public:

View File

@ -0,0 +1,66 @@
// Filename: physxSoftBody.I
// Created by: enn0x (13Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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: PhysxSoftBody::Constructor
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
INLINE PhysxSoftBody::
PhysxSoftBody() : PhysxObject() {
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::Destructor
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
INLINE PhysxSoftBody::
~PhysxSoftBody() {
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::ls
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
INLINE void PhysxSoftBody::
ls() const {
ls(nout);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::ls
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
INLINE void PhysxSoftBody::
ls(ostream &out, int indent_level) const {
indent(out, indent_level) << get_type().get_name()
<< " " << _name
<< " (at 0x" << this << ")";
if (_node) {
out << " N:0x" << _node;
}
out << "\n";
}

View File

@ -0,0 +1,914 @@
// Filename: physxSoftBody.cxx
// Created by: enn0x (13Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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 "physxSoftBody.h"
#include "physxSoftBodyDesc.h"
#include "physxSoftBodyNode.h"
#include "physxScene.h"
#include "physxGroupsMask.h"
#include "boundingBox.h"
TypeHandle PhysxSoftBody::_type_handle;
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::link
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
link(NxSoftBody *softbodyPtr) {
// Link self
_ptr = softbodyPtr;
_error_type = ET_ok;
_ptr->userData = this;
set_name(softbodyPtr->getName());
PhysxScene *scene = (PhysxScene *)_ptr->getScene().userData;
scene->_softbodies.add(this);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::unlink
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
unlink() {
// Unlink self
_ptr->userData = NULL;
_error_type = ET_released;
PhysxScene *scene = (PhysxScene *)_ptr->getScene().userData;
scene->_softbodies.remove(this);
_node = NULL;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::release
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
release() {
nassertv(_error_type == ET_ok);
unlink();
_ptr->getScene().releaseSoftBody(*_ptr);
_ptr = NULL;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::update
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
update() {
if (_node) {
// Update node mesh data
_node->update();
// Update node bounding volume
NxBounds3 bounds;
_ptr->getWorldBounds(bounds);
BoundingBox bb(PhysxManager::nxVec3_to_point3(bounds.min),
PhysxManager::nxVec3_to_point3(bounds.max));
_node->set_bounds(&bb);
}
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_scene
// Access: Published
// Description: Returns the scene which this soft body belongs to.
////////////////////////////////////////////////////////////////////
PhysxScene *PhysxSoftBody::
get_scene() const {
nassertr(_error_type == ET_ok, NULL);
return (PhysxScene *)_ptr->getScene().userData;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_soft_body_node
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
PhysxSoftBodyNode *PhysxSoftBody::
get_soft_body_node() const {
nassertr(_error_type == ET_ok, NULL);
return _node;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::create_soft_body_node
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
PhysxSoftBodyNode *PhysxSoftBody::
create_soft_body_node(const char *name) {
nassertr(_error_type == ET_ok, NULL);
_node = new PhysxSoftBodyNode(name);
_node->allocate(this);
return _node;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_name
// Access: Published
// Description: Sets a name string for the object that can be
// retrieved with get_name().
// This is for debugging and is not used by the
// engine.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_name(const char *name) {
nassertv(_error_type == ET_ok);
_name = name ? name : "";
_ptr->setName(_name.c_str());
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_name
// Access: Published
// Description: Retrieves the name string.
////////////////////////////////////////////////////////////////////
const char *PhysxSoftBody::
get_name() const {
nassertr(_error_type == ET_ok, "");
return _ptr->getName();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_group
// Access: Published
// Description: Sets which collision group this soft body is part
// of. Collision group must be between 0 and 31.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_group(unsigned int group) {
nassertv(_error_type == ET_ok);
nassertv(group >= 0 && group < 32);
_ptr->setGroup(group);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_group
// Access: Published
// Description: Retrieves the collision group this soft body is
// part of.
////////////////////////////////////////////////////////////////////
unsigned int PhysxSoftBody::
get_group() const {
nassertr(_error_type == ET_ok, 0);
return _ptr->getGroup();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_groups_mask
// Access: Published
// Description: Sets 128-bit mask used for collision filtering.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_groups_mask(const PhysxGroupsMask &mask) {
nassertv(_error_type == ET_ok);
NxGroupsMask _mask = mask.get_mask();
_ptr->setGroupsMask(_mask);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_groups_mask
// Access: Published
// Description: Gets the 128-bit groups mask used for collision
// filtering.
////////////////////////////////////////////////////////////////////
PhysxGroupsMask PhysxSoftBody::
get_groups_mask() const {
PhysxGroupsMask mask;
nassertr(_error_type == ET_ok, mask);
NxGroupsMask _mask = _ptr->getGroupsMask();
mask.set_mask(_mask);
return mask;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_num_particles
// Access: Published
// Description: Gets the number of cloth particles.
////////////////////////////////////////////////////////////////////
unsigned int PhysxSoftBody::
get_num_particles() {
nassertr(_error_type == ET_ok, 0);
return _ptr->getNumberOfParticles();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_particle_radius
// Access: Published
// Description: Sets the soft body particle radius (must be
// positive).
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_particle_radius(float radius) {
nassertv(_error_type == ET_ok);
_ptr->setParticleRadius(radius);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_particle_radius
// Access: Published
// Description: Gets the soft body particle radius.
////////////////////////////////////////////////////////////////////
float PhysxSoftBody::
get_particle_radius() const {
nassertr(_error_type == ET_ok, 0.0f);
return _ptr->getParticleRadius();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_flag
// Access: Published
// Description: Sets the value of a single flag.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_flag(PhysxSoftBodyFlag flag, bool value) {
nassertv(_error_type == ET_ok);
NxU32 flags = _ptr->getFlags();
if (value == true) {
flags |= flag;
}
else {
flags &= ~(flag);
}
_ptr->setFlags(flags);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_flag
// Access: Published
// Description: Retrieves the value of a single flag.
////////////////////////////////////////////////////////////////////
bool PhysxSoftBody::
get_flag(PhysxSoftBodyFlag flag) const {
nassertr(_error_type == ET_ok, false);
return (_ptr->getFlags() & flag) ? true : false;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_density
// Access: Published
// Description: Gets the soft body density.
////////////////////////////////////////////////////////////////////
float PhysxSoftBody::
get_density() const {
nassertr(_error_type == ET_ok, 0.0f);
return _ptr->getDensity();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_relative_grid_spacing
// Access: Published
// Description: Gets the relative grid spacing for the broad
// phase. The cloth is represented by a set of
// world aligned cubical cells in broad phase. The
// size of these cells is determined by multiplying
// the length of the diagonal of the AABB of the
// initial soft body size with this constant.
////////////////////////////////////////////////////////////////////
float PhysxSoftBody::
get_relative_grid_spacing() const {
nassertr(_error_type == ET_ok, 0.0f);
return _ptr->getRelativeGridSpacing();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_volume_stiffness
// Access: Published
// Description: Sets the soft body volume stiffness in the range
// from 0 to 1.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_volume_stiffness(float stiffness) {
nassertv(_error_type == ET_ok);
ptr()->setVolumeStiffness(stiffness);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_volume_stiffness
// Access: Published
// Description: Retrieves the soft body volume stiffness.
////////////////////////////////////////////////////////////////////
float PhysxSoftBody::
get_volume_stiffness() const {
nassertr(_error_type == ET_ok, 0.0f);
return ptr()->getVolumeStiffness();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_stretching_stiffness
// Access: Published
// Description: Sets the soft body stretching stiffness in the
// range from 0 to 1.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_stretching_stiffness(float stiffness) {
nassertv(_error_type == ET_ok);
ptr()->setStretchingStiffness(stiffness);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_stretching_stiffness
// Access: Published
// Description: Retrieves the soft body stretching stiffness.
////////////////////////////////////////////////////////////////////
float PhysxSoftBody::
get_stretching_stiffness() const {
nassertr(_error_type == ET_ok, 0.0f);
return ptr()->getStretchingStiffness();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_damping_coefficient
// Access: Published
// Description: Sets the damping coefficient in the range from 0
// to 1.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_damping_coefficient(float coef) {
nassertv(_error_type == ET_ok);
ptr()->setDampingCoefficient(coef);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_damping_coefficient
// Access: Published
// Description: Retrieves the damping coefficient.
////////////////////////////////////////////////////////////////////
float PhysxSoftBody::
get_damping_coefficient() const {
nassertr(_error_type == ET_ok, 0.0f);
return ptr()->getDampingCoefficient();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_friction
// Access: Published
// Description: Sets the soft body friction coefficient in the
// range from 0 to 1.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_friction(float friction) {
nassertv(_error_type == ET_ok);
ptr()->setFriction(friction);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_friction
// Access: Published
// Description: Retrieves the soft body friction coefficient.
////////////////////////////////////////////////////////////////////
float PhysxSoftBody::
get_friction() const {
nassertr(_error_type == ET_ok, 0.0f);
return ptr()->getFriction();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_tear_factor
// Access: Published
// Description: Sets the soft body tear factor (must be larger
// than one).
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_tear_factor(float factor) {
nassertv(_error_type == ET_ok);
nassertv(factor > 1.0f);
ptr()->setTearFactor(factor);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_tear_factor
// Access: Published
// Description: Retrieves the soft body tear factor.
////////////////////////////////////////////////////////////////////
float PhysxSoftBody::
get_tear_factor() const {
nassertr(_error_type == ET_ok, 0.0f);
return ptr()->getTearFactor();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_attachment_tear_factor
// Access: Published
// Description: Sets the soft body attachment tear factor (must be
// larger than one).
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_attachment_tear_factor(float factor) {
nassertv(_error_type == ET_ok);
nassertv(factor > 1.0f);
ptr()->setAttachmentTearFactor(factor);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_attachment_tear_factor
// Access: Published
// Description: Retrieves the attachment soft body tear factor.
////////////////////////////////////////////////////////////////////
float PhysxSoftBody::
get_attachment_tear_factor() const {
nassertr(_error_type == ET_ok, 0.0f);
return ptr()->getAttachmentTearFactor();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_solver_iterations
// Access: Published
// Description: Sets the soft body solver iterations.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_solver_iterations(unsigned int iterations) {
nassertv(_error_type == ET_ok);
ptr()->setSolverIterations(iterations);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_solver_iterations
// Access: Published
// Description: Retrieves the soft body solver iterations.
////////////////////////////////////////////////////////////////////
unsigned int PhysxSoftBody::
get_solver_iterations() const {
nassertr(_error_type == ET_ok, 0);
return ptr()->getSolverIterations();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::is_sleeping
// Access: Published
// Description: Returns true if this soft body is sleeping.
//
// When a soft body does not move for a period of
// time, it is no longer simulated in order to save
// time. This state is called sleeping. However,
// because the object automatically wakes up when it
// is either touched by an awake object, or one of its
// properties is changed by the user, the entire sleep
// mechanism should be transparent to the user.
////////////////////////////////////////////////////////////////////
bool PhysxSoftBody::
is_sleeping() const {
nassertr(_error_type == ET_ok, false);
return _ptr->isSleeping();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::wake_up
// Access: Published
// Description: Wakes up the soft body if it is sleeping.
//
// The wakeCounterValue determines how long until the
// body is put to sleep, a value of zero means that
// the body is sleeping. wake_up(0) is equivalent to
// PhysxSoftBody::put_to_sleep().
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
wake_up(float wakeCounterValue) {
nassertv(_error_type == ET_ok);
_ptr->wakeUp(wakeCounterValue);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::put_to_sleep
// Access: Published
// Description: Forces the soft body to sleep.
//
// The soft body will stay asleep until the next
// call to simulate, and will not wake up until then
// even when otherwise it would (for example a force
// is applied to it). It can however wake up during
// the next do_physics call.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
put_to_sleep() {
nassertv(_error_type == ET_ok);
_ptr->putToSleep();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_sleep_linear_velocity
// Access: Published
// Description: Sets the linear velocity below which an soft body
// may go to sleep. SoftBodys whose linear velocity is
// above this threshold will not be put to sleep.
//
// Setting the sleep angular/linear velocity only
// makes sense when the BF_energy_sleep_test is not
// set.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_sleep_linear_velocity(float threshold) {
nassertv(_error_type == ET_ok);
_ptr->setSleepLinearVelocity(threshold);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_sleep_linear_velocity
// Access: Published
// Description: Returns the linear velocity below which an soft
// body may go to sleep. Soft bodies whose linear
// velocity is above this threshold will not be put
// to sleep.
////////////////////////////////////////////////////////////////////
float PhysxSoftBody::
get_sleep_linear_velocity() const {
nassertr(_error_type == ET_ok, 0.0f);
return _ptr->getSleepLinearVelocity();
}
#ifndef PHYSX281
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_self_collision_thickness
// Access: Published
// Description: Sets the soft body self collision thickness (must
// be positive).
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_self_collision_thickness(float thickness) {
nassertv(_error_type == ET_ok);
_ptr->setSelfCollisionThickness(thickness);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_self_collision_thickness
// Access: Published
// Description: Gets the soft body self collision thickness.
////////////////////////////////////////////////////////////////////
float PhysxSoftBody::
get_self_collision_thickness() const {
nassertr(_error_type == ET_ok, 0.0f);
return _ptr->getSelfCollisionThickness();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_hard_stretch_limitation_factor
// Access: Published
// Description: Sets the soft body hard stretch elongation limit.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_hard_stretch_limitation_factor(float factor) {
nassertv(_error_type == ET_ok);
ptr()->setHardStretchLimitationFactor(factor);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_hard_stretch_limitation_factor
// Access: Published
// Description: Retrieves the soft body hard stretch elongation
// limit.
////////////////////////////////////////////////////////////////////
float PhysxSoftBody::
get_hard_stretch_limitation_factor() const {
nassertr(_error_type == ET_ok, 0.0f);
return ptr()->getHardStretchLimitationFactor();
}
#endif // PHYSX281
/*
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::attach_vertex_to_global_pos
// Access: Published
// Description: Attaches a cloth vertex to a position in world
// space.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
attach_vertex_to_global_pos(unsigned int vertexId, LPoint3f const &pos) {
nassertv(_error_type == ET_ok);
nassertv(!pos.is_nan());
_ptr->attachVertexToGlobalPosition(vertexId, PhysxManager::point3_to_nxVec3(pos));
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::attach_to_shape
// Access: Published
// Description: Attaches the cloth to a shape. All cloth points
// currently inside the shape are attached.
//
// This method only works with primitive and convex
// shapes. Since the inside of a general triangle mesh
// is not clearly defined.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
attach_to_shape(PhysxShape *shape) {
nassertv(_error_type == ET_ok);
nassertv(shape);
NxU32 attachmentFlags = 0; // --TODO--
_ptr->attachToShape(shape->ptr(), attachmentFlags);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::attach_to_colliding_shapes
// Access: Published
// Description: Attaches the cloth to all shapes, currently
// colliding.
//
// This method only works with primitive and convex
// shapes. Since the inside of a general triangle mesh
// is not clearly defined.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
attach_to_colliding_shapes() {
nassertv(_error_type == ET_ok);
NxU32 attachmentFlags = 0; // --TODO--
_ptr->attachToCollidingShapes(attachmentFlags);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::detach_from_shape
// Access: Published
// Description: Detaches the cloth from a shape it has been
// attached to before.
//
// If the cloth has not been attached to the shape
// before, the call has no effect.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
detach_from_shape(PhysxShape *shape) {
nassertv(_error_type == ET_ok);
nassertv(shape);
_ptr->detachFromShape(shape->ptr());
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::free_vertex
// Access: Published
// Description: Frees a previously attached cloth point.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
free_vertex(unsigned int vertexId) {
nassertv(_error_type == ET_ok);
_ptr->freeVertex(vertexId);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::attach_vertex_to_shape
// Access: Published
// Description: Attaches a cloth vertex to a local position within
// a shape.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
attach_vertex_to_shape(unsigned int vertexId, PhysxShape *shape, LPoint3f const &localPos) {
nassertv(_error_type == ET_ok);
nassertv(!localPos.is_nan());
nassertv(shape);
NxU32 attachmentFlags = 0; // --TODO--
_ptr->attachVertexToShape(vertexId, shape->ptr(),
PhysxManager::point3_to_nxVec3(localPos),
attachmentFlags);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_vertex_attachment_status
// Access: Published
// Description: Return the attachment status of the given vertex.
////////////////////////////////////////////////////////////////////
PhysxEnums::PhysxVertexAttachmentStatus PhysxSoftBody::
get_vertex_attachment_status(unsigned int vertexId) const {
nassertr(_error_type == ET_ok, VAS_none);
// --TODO-- nassertr(vertexId < _ptr->getNumberOfParticles(), VAS_none);
return (PhysxVertexAttachmentStatus) _ptr->getVertexAttachmentStatus(vertexId);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_vertex_attachment_shape
// Access: Published
// Description: Returns the pointer to an attached shape pointer
// of the given vertex. If the vertex is not attached
// or attached to a global position, NULL is returned.
////////////////////////////////////////////////////////////////////
PhysxShape *PhysxSoftBody::
get_vertex_attachment_shape(unsigned int vertexId) const {
nassertr(_error_type == ET_ok, NULL);
// --TODO-- nassertr(vertexId < _ptr->getNumberOfParticles(), NULL);
NxShape *shapePtr = _ptr->getVertexAttachmentShape(vertexId);
PhysxShape *shape = shapePtr ? (PhysxShape *)(shapePtr->userData) : NULL;
return shape;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_vertex_attachment_pos
// Access: Published
// Description: Returns the attachment position of the given
// vertex. If the vertex is attached to shape, the
// position local to the shape's pose is returned. If
// the vertex is not attached, the return value is
// undefined.
////////////////////////////////////////////////////////////////////
LPoint3f PhysxSoftBody::
get_vertex_attachment_pos(unsigned int vertexId) const {
nassertr(_error_type == ET_ok, LPoint3f::zero());
// --TODO-- nassertr(vertexId < _ptr->getNumberOfParticles(), LPoint3f::zero());
return PhysxManager::nxVec3_to_point3(_ptr->getVertexAttachmentPosition(vertexId));
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_external_acceleration
// Access: Published
// Description: Sets an external acceleration which affects all non
// attached particles of the cloth.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_external_acceleration(LVector3f const &acceleration) {
nassertv(_error_type == ET_ok);
nassertv_always(!acceleration.is_nan());
_ptr->setExternalAcceleration(PhysxManager::vec3_to_nxVec3(acceleration));
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::set_wind_acceleration
// Access: Published
// Description: Sets an acceleration acting normal to the cloth
// surface at each vertex.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
set_wind_acceleration(LVector3f const &acceleration) {
nassertv(_error_type == ET_ok);
nassertv_always(!acceleration.is_nan());
_ptr->setWindAcceleration(PhysxManager::vec3_to_nxVec3(acceleration));
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_external_acceleration
// Access: Published
// Description: Retrieves the external acceleration which affects
// all non attached particles of the cloth.
////////////////////////////////////////////////////////////////////
LVector3f PhysxSoftBody::
get_external_acceleration() const {
nassertr(_error_type == ET_ok, LVector3f::zero());
return PhysxManager::nxVec3_to_vec3(_ptr->getExternalAcceleration());
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::get_wind_acceleration
// Access: Published
// Description: Retrieves the acceleration acting normal to the
// cloth surface at each vertex
////////////////////////////////////////////////////////////////////
LVector3f PhysxSoftBody::
get_wind_acceleration() const {
nassertr(_error_type == ET_ok, LVector3f::zero());
return PhysxManager::nxVec3_to_vec3(_ptr->getWindAcceleration());
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::add_force_at_vertex
// Access: Published
// Description: Applies a force (or impulse) defined in the
// global coordinate frame, to a particular vertex
// of the cloth.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
add_force_at_vertex(LVector3f const &force, int vertexId, PhysxForceMode mode) {
nassertv(_error_type == ET_ok);
_ptr->addForceAtVertex(PhysxManager::vec3_to_nxVec3(force),
vertexId,
(NxForceMode) mode);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::add_force_at_pos
// Access: Published
// Description: Applies a radial force (or impulse) at a
// particular position. All vertices within radius
// will be affected with a quadratic drop-off.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
add_force_at_pos(LPoint3f const &pos, float magnitude, float radius, PhysxForceMode mode) {
nassertv(_error_type == ET_ok);
_ptr->addForceAtPos(PhysxManager::point3_to_nxVec3(pos),
magnitude,
radius,
(NxForceMode) mode);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBody::add_directed_force_at_pos
// Access: Published
// Description: Applies a directed force (or impulse) at a
// particular position. All vertices within radius
// will be affected with a quadratic drop-off.
////////////////////////////////////////////////////////////////////
void PhysxSoftBody::
add_directed_force_at_pos(LPoint3f const &pos, LVector3f const &force, float radius, PhysxForceMode mode) {
nassertv(_error_type == ET_ok);
_ptr->addDirectedForceAtPos(PhysxManager::point3_to_nxVec3(pos),
PhysxManager::vec3_to_nxVec3(force),
radius,
(NxForceMode) mode);
}
*/

View File

@ -0,0 +1,218 @@
// Filename: physxSoftBody.h
// Created by: enn0x (13Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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 PHYSXSOFTBODY_H
#define PHYSXSOFTBODY_H
#include "pandabase.h"
#include "lvector3.h"
#include "lpoint3.h"
#include "physxObject.h"
#include "physxObjectCollection.h"
#include "physxEnums.h"
#include "physx_includes.h"
class PhysxScene;
class PhysxGroupsMask;
class PhysxSoftBodyNode;
////////////////////////////////////////////////////////////////////
// Class : PhysxSoftBody
// Description :
////////////////////////////////////////////////////////////////////
class EXPCL_PANDAPHYSX PhysxSoftBody : public PhysxObject, public PhysxEnums {
PUBLISHED:
INLINE PhysxSoftBody();
INLINE ~PhysxSoftBody();
PhysxScene *get_scene() const;
PhysxSoftBodyNode *get_soft_body_node() const;
PhysxSoftBodyNode *create_soft_body_node(const char *name);
void set_name(const char *name);
void set_flag(PhysxSoftBodyFlag flag, bool value);
void set_groups_mask(const PhysxGroupsMask &mask);
void set_group(unsigned int group);
void set_solver_iterations(unsigned int iterations);
void set_particle_radius(float radius);
#ifndef PHYSX281
void set_self_collision_thickness(float thickness);
void set_hard_stretch_limitation_factor(float factor);
#endif
void set_volume_stiffness(float stiffness);
void set_stretching_stiffness(float stiffness);
void set_damping_coefficient(float coef);
void set_friction(float friction);
void set_tear_factor(float factor);
void set_attachment_tear_factor(float factor);
const char *get_name() const;
bool get_flag(PhysxSoftBodyFlag flag) const;
PhysxGroupsMask get_groups_mask() const;
unsigned int get_group() const;
unsigned int get_num_particles();
unsigned int get_solver_iterations() const;
float get_particle_radius() const;
float get_density() const;
float get_relative_grid_spacing() const;
#ifndef PHYSX281
float get_self_collision_thickness() const;
float get_hard_stretch_limitation_factor() const;
#endif
float get_volume_stiffness() const;
float get_stretching_stiffness() const;
float get_damping_coefficient() const;
float get_friction() const;
float get_tear_factor() const;
float get_attachment_tear_factor() const;
/*
// Attachment
void attach_vertex_to_global_pos(unsigned int vertexId, LPoint3f const &pos);
void free_vertex(unsigned int vertexId);
void attach_to_shape(PhysxShape *shape);
void attach_to_colliding_shapes();
void detach_from_shape(PhysxShape *shape);
void attach_vertex_to_shape(unsigned int vertexId, PhysxShape *shape, LPoint3f const &localPos);
PhysxVertexAttachmentStatus get_vertex_attachment_status(unsigned int vertexId) const;
PhysxShape *get_vertex_attachment_shape(unsigned int vertexId) const;
LPoint3f get_vertex_attachment_pos(unsigned int vertexId) const;
*/
// Sleeping
bool is_sleeping() const;
void wake_up(float wakeCounterValue=NX_SLEEP_INTERVAL);
void put_to_sleep();
void set_sleep_linear_velocity(float threshold);
float get_sleep_linear_velocity() const;
/*
// Forces
void set_external_acceleration(LVector3f const &acceleration);
LVector3f get_external_acceleration() const;
void set_wind_acceleration(LVector3f const &acceleration);
LVector3f get_wind_acceleration() const;
void add_force_at_vertex(LVector3f const &force, int vertexId,
PhysxForceMode mode=FM_force);
void add_force_at_pos(LPoint3f const &pos, float magnitude, float radius,
PhysxForceMode mode=FM_force);
void add_directed_force_at_pos(LPoint3f const &pos, LVector3f const &force, float radius,
PhysxForceMode mode=FM_force);
*/
/*
virtual void getWorldBounds (NxBounds3 &bounds) const =0
virtual void attachToShape (const NxShape *shape, NxU32 attachmentFlags)=0
virtual void attachToCollidingShapes (NxU32 attachmentFlags)=0
virtual void detachFromShape (const NxShape *shape)=0
virtual void attachVertexToShape (NxU32 vertexId, const NxShape *shape, const NxVec3 &localPos, NxU32 attachmentFlags)=0
virtual void attachVertexToGlobalPosition (const NxU32 vertexId, const NxVec3 &pos)=0
virtual void freeVertex (const NxU32 vertexId)=0
virtual bool tearVertex (const NxU32 vertexId, const NxVec3 &normal)=0
virtual bool raycast (const NxRay &worldRay, NxVec3 &hit, NxU32 &vertexId)=0
virtual void setMeshData (NxMeshData &meshData)=0
virtual NxMeshData getMeshData ()=0
virtual void setSplitPairData (NxSoftBodySplitPairData &splitPairData)=0
virtual NxSoftBodySplitPairData getSplitPairData ()=0
virtual void setValidBounds (const NxBounds3 &validBounds)=0
virtual void getValidBounds (NxBounds3 &validBounds) const =0
virtual void setPosition (const NxVec3 &position, NxU32 vertexId)=0
virtual void setPositions (void *buffer, NxU32 byteStride=sizeof(NxVec3))=0
virtual NxVec3 getPosition (NxU32 vertexId) const =0
virtual void getPositions (void *buffer, NxU32 byteStride=sizeof(NxVec3))=0
virtual void setVelocity (const NxVec3 &velocity, NxU32 vertexId)=0
virtual void setVelocities (void *buffer, NxU32 byteStride=sizeof(NxVec3))=0
virtual NxVec3 getVelocity (NxU32 vertexId) const =0
virtual void getVelocities (void *buffer, NxU32 byteStride=sizeof(NxVec3))=0
virtual void setConstrainPositions (void *buffer, NxU32 byteStride=sizeof(NxVec3))=0
virtual void setConstrainNormals (void *buffer, NxU32 byteStride=sizeof(NxVec3))=0
virtual void setConstrainCoefficients (const NxSoftBodyConstrainCoefficients *coefficients, NxU32 byteStride=sizeof(NxSoftBodyConstrainCoefficients))=0
virtual NxU32 queryShapePointers ()=0
virtual NxU32 getStateByteSize ()=0
virtual void getShapePointers (NxShape **shapePointers, NxU32 *flags)=0
virtual void setShapePointers (NxShape **shapePointers, unsigned int numShapes)=0
virtual void saveStateToStream (NxStream &stream, bool permute=false)=0
virtual void loadStateFromStream (NxStream &stream)=0
virtual void setCollisionResponseCoefficient (NxReal coefficient)=0
virtual NxReal getCollisionResponseCoefficient () const =0
virtual void setAttachmentResponseCoefficient (NxReal coefficient)=0
virtual NxReal getAttachmentResponseCoefficient () const =0
virtual void setFromFluidResponseCoefficient (NxReal coefficient)=0
virtual NxReal getFromFluidResponseCoefficient () const =0
virtual void setToFluidResponseCoefficient (NxReal coefficient)=0
virtual NxReal getToFluidResponseCoefficient () const =0
virtual void setExternalAcceleration (NxVec3 acceleration)=0
virtual NxVec3 getExternalAcceleration () const =0
virtual void setMinAdhereVelocity (NxReal velocity)=0
virtual NxReal getMinAdhereVelocity () const =0
virtual void addForceAtVertex (const NxVec3 &force, NxU32 vertexId, NxForceMode mode=NX_FORCE)=0
virtual void addForceAtPos (const NxVec3 &position, NxReal magnitude, NxReal radius, NxForceMode mode=NX_FORCE)=0
virtual void addDirectedForceAtPos (const NxVec3 &position, const NxVec3 &force, NxReal radius, NxForceMode mode=NX_FORCE)=0
virtual bool overlapAABBTetrahedra (const NxBounds3 &bounds, NxU32 &nb, const NxU32 *&indices) const =0
virtual NxCompartment * getCompartment () const =0
virtual NxForceFieldMaterial getForceFieldMaterial () const =0
virtual void setForceFieldMaterial (NxForceFieldMaterial)=0
*/
INLINE void ls() const;
INLINE void ls(ostream &out, int indent_level=0) const;
public:
void update();
////////////////////////////////////////////////////////////////////
PUBLISHED:
void release();
public:
INLINE NxSoftBody *ptr() const { return _ptr; };
void link(NxSoftBody *ptr);
void unlink();
private:
NxSoftBody *_ptr;
PT(PhysxSoftBodyNode) _node;
string _name;
////////////////////////////////////////////////////////////////////
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
PhysxObject::init_type();
register_type(_type_handle, "PhysxSoftBody",
PhysxObject::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 "physxSoftBody.I"
#endif // PHYSXSOFTBODY_H

View File

@ -0,0 +1,60 @@
// Filename: physxSoftBodyDesc.I
// Created by: enn0x (12Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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: PhysxSoftBodyDesc::Constructor
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
INLINE PhysxSoftBodyDesc::
PhysxSoftBodyDesc() {
set_to_default();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::Destructor
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
INLINE PhysxSoftBodyDesc::
~PhysxSoftBodyDesc() {
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_to_default
// Access: Published
// Description: (re)sets the structure to the default.
////////////////////////////////////////////////////////////////////
INLINE void PhysxSoftBodyDesc::
set_to_default() {
_desc.setToDefault();
set_name("");
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::is_valid
// Access: Published
// Description: Returns true if the descriptor is valid.
////////////////////////////////////////////////////////////////////
INLINE bool PhysxSoftBodyDesc::
is_valid() const {
return _desc.isValid();
}

View File

@ -0,0 +1,403 @@
// Filename: physxSoftBodyDesc.cxx
// Created by: enn0x (12Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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 "physxSoftBodyDesc.h"
#include "physxSoftBodyMesh.h"
#include "physxManager.h"
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_name
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_name(const char *name) {
_name = name ? name : "";
_desc.name = _name.c_str();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_global_pos
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_global_pos(const LPoint3f &pos) {
_desc.globalPose.t = PhysxManager::point3_to_nxVec3(pos);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_global_mat
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_global_mat(const LMatrix4f &mat) {
_desc.globalPose = PhysxManager::mat4_to_nxMat34(mat);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_global_hpr
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_global_hpr(float h, float p, float r) {
LQuaternionf q;
LMatrix3f rot;
NxMat34 m;
q.set_hpr(LVector3f(h, p, r));
q.extract_to_matrix(rot);
_desc.globalPose.M = PhysxManager::mat3_to_nxMat33(rot);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_particle_radius
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_particle_radius(float radius) {
_desc.particleRadius = radius;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_relative_grid_spacing
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_relative_grid_spacing(float spacing) {
_desc.relativeGridSpacing = spacing;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_collision_response_coefficient
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_collision_response_coefficient(float coef) {
_desc.collisionResponseCoefficient = coef;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_attachment_response_coefficient
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_attachment_response_coefficient(float coef) {
_desc.attachmentResponseCoefficient = coef;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_density
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_density(float density) {
_desc.density = density;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_volume_stiffness
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_volume_stiffness(float stiffness) {
_desc.volumeStiffness = stiffness;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_stretching_stiffness
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_stretching_stiffness(float stiffness) {
_desc.stretchingStiffness = stiffness;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_damping_coefficient
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_damping_coefficient(float damping) {
_desc.dampingCoefficient = damping;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_friction
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_friction(float friction) {
_desc.friction = friction;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_tear_factor
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_tear_factor(float tearFactor) {
_desc.tearFactor = tearFactor;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_flag
// Access: Published
// Description: Raise or lower individual SoftBodyFlag flags.
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_flag(PhysxSoftBodyFlag flag, bool value) {
if (value == true) {
_desc.flags |= flag;
}
else {
_desc.flags &= ~(flag);
}
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_solver_iterations
// Access: Published
// Description: Number of solver iterations.
// Small numbers make the simulation faster while
// the soft body gets less stiff.
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_solver_iterations(unsigned int iterations) {
_desc.solverIterations = iterations;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::set_soft_body_mesh
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
set_soft_body_mesh(PhysxSoftBodyMesh *mesh) {
_desc.softBodyMesh = mesh->ptr();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_name
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
const char *PhysxSoftBodyDesc::
get_name() const {
return _desc.name;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_global_pos
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
LPoint3f PhysxSoftBodyDesc::
get_global_pos() const {
return PhysxManager::nxVec3_to_point3(_desc.globalPose.t);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_global_mat
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
LMatrix4f PhysxSoftBodyDesc::
get_global_mat() const {
return PhysxManager::nxMat34_to_mat4(_desc.globalPose);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_particle_radius
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
float PhysxSoftBodyDesc::
get_particle_radius() const {
return _desc.particleRadius;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_relative_grid_spacing
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
float PhysxSoftBodyDesc::
get_relative_grid_spacing() const {
return _desc.relativeGridSpacing;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_collision_response_coefficient
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
float PhysxSoftBodyDesc::
get_collision_response_coefficient() const {
return _desc.collisionResponseCoefficient;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_attachment_response_coefficient
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
float PhysxSoftBodyDesc::
get_attachment_response_coefficient() const {
return _desc.attachmentResponseCoefficient;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_density
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
float PhysxSoftBodyDesc::
get_density() const {
return _desc.density;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_volume_stiffness
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
float PhysxSoftBodyDesc::
get_volume_stiffness() const {
return _desc.volumeStiffness;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_stretching_stiffness
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
float PhysxSoftBodyDesc::
get_stretching_stiffness() const {
return _desc.stretchingStiffness;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_damping_coefficient
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
float PhysxSoftBodyDesc::
get_damping_coefficient() const {
return _desc.dampingCoefficient;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_friction
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
float PhysxSoftBodyDesc::
get_friction() const {
return _desc.friction;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_tear_factor
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
float PhysxSoftBodyDesc::
get_tear_factor() const {
return _desc.tearFactor;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_flag
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
bool PhysxSoftBodyDesc::
get_flag(PhysxSoftBodyFlag flag) const {
return (_desc.flags & flag) ? true : false;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_solver_iterations
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
unsigned int PhysxSoftBodyDesc::
get_solver_iterations() const {
return _desc.solverIterations;
}
/*
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyDesc::get_mesh_numbers
// Access: Public
// Description: Used by PhysScene to query the sizes of arrays
// to allocate for the user buffers in PhysxSoftBodyNode.
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyDesc::
get_mesh_numbers(NxU32 &numVertices, NxU32 &numTriangles) {
NxSoftBodyMeshDesc meshDesc;
_desc.clothMesh->saveToDesc(meshDesc);
numVertices = meshDesc.numVertices;
numTriangles = meshDesc.numTriangles;
}
*/

View File

@ -0,0 +1,84 @@
// Filename: physxSoftBodyDesc.h
// Created by: enn0x (12Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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 PHYSXSOFTBODYDESC_H
#define PHYSXSOFTBODYDESC_H
#include "pandabase.h"
#include "lpoint3.h"
#include "lmatrix.h"
#include "physxEnums.h"
#include "physx_includes.h"
class PhysxSoftBodyMesh;
////////////////////////////////////////////////////////////////////
// Class : PhysxSoftBodyDesc
// Description : Descriptor for PhysxSoftBody.
////////////////////////////////////////////////////////////////////
class EXPCL_PANDAPHYSX PhysxSoftBodyDesc : public PhysxEnums {
PUBLISHED:
INLINE PhysxSoftBodyDesc();
INLINE ~PhysxSoftBodyDesc();
INLINE void set_to_default();
INLINE bool is_valid() const;
void set_soft_body_mesh(PhysxSoftBodyMesh *mesh);
void set_name(const char *name);
void set_global_pos(const LPoint3f &pos);
void set_global_mat(const LMatrix4f &mat);
void set_global_hpr(float h, float p, float r);
void set_density(float density);
void set_volume_stiffness(float stiffness);
void set_stretching_stiffness(float stiffness);
void set_damping_coefficient(float damping);
void set_friction(float friction);
void set_tear_factor(float tearFactor);
void set_particle_radius(float radius);
void set_relative_grid_spacing(float spacing);
void set_collision_response_coefficient(float coef);
void set_attachment_response_coefficient(float coef);
void set_solver_iterations(unsigned int interations);
void set_flag(PhysxSoftBodyFlag flag, bool value);
const char *get_name() const;
LPoint3f get_global_pos() const;
LMatrix4f get_global_mat() const;
float get_density() const;
float get_volume_stiffness() const;
float get_stretching_stiffness() const;
float get_damping_coefficient() const;
float get_friction() const;
float get_tear_factor() const;
float get_particle_radius() const;
float get_relative_grid_spacing() const;
float get_collision_response_coefficient() const;
float get_attachment_response_coefficient() const;
unsigned int get_solver_iterations() const;
bool get_flag(PhysxSoftBodyFlag flag) const;
public:
NxSoftBodyDesc _desc;
private:
string _name;
};
#include "physxSoftBodyDesc.I"
#endif // PHYSXSOFTBODYDESC_H

View File

@ -0,0 +1,59 @@
// Filename: physxSoftBodyMesh.I
// Created by: enn0x (12Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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: PhysxSoftBodyMesh::Constructor
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
INLINE PhysxSoftBodyMesh::
PhysxSoftBodyMesh() : PhysxObject() {
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMesh::Destructor
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
INLINE PhysxSoftBodyMesh::
~PhysxSoftBodyMesh() {
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMesh::ls
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
INLINE void PhysxSoftBodyMesh::
ls() const {
ls(nout);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMesh::ls
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
INLINE void PhysxSoftBodyMesh::
ls(ostream &out, int indent_level) const {
indent(out, indent_level) << get_type().get_name()
<< " (at 0x" << this << ")\n";
}

View File

@ -0,0 +1,76 @@
// Filename: physxSoftBodyMesh.cxx
// Created by: enn0x (12Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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 "physxSoftBodyMesh.h"
#include "physxMeshPool.h"
TypeHandle PhysxSoftBodyMesh::_type_handle;
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMesh::link
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyMesh::
link(NxSoftBodyMesh *meshPtr) {
// Link self
PhysxManager::get_global_ptr()->_softbody_meshes.add(this);
_ptr = meshPtr;
_error_type = ET_ok;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMesh::unlink
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyMesh::
unlink() {
// Unlink self
_error_type = ET_released;
PhysxManager::get_global_ptr()->_softbody_meshes.remove(this);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMesh::release
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyMesh::
release() {
nassertv(_error_type == ET_ok);
unlink();
NxGetPhysicsSDK()->releaseSoftBodyMesh(*_ptr);
_ptr = NULL;
PhysxMeshPool::release_soft_body_mesh(this);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMesh::get_reference_count
// Access: Published
// Description: Returns the reference count for shared meshes.
////////////////////////////////////////////////////////////////////
unsigned int PhysxSoftBodyMesh::
get_reference_count() const {
nassertr(_error_type == ET_ok, 0);
return _ptr->getReferenceCount();
}

View File

@ -0,0 +1,75 @@
// Filename: physxSoftBodyMesh.h
// Created by: enn0x (12Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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 PHYSXSOFTBODYMESH_H
#define PHYSXSOFTBODYMESH_H
#include "pandabase.h"
#include "physxObject.h"
#include "physx_includes.h"
////////////////////////////////////////////////////////////////////
// Class : PhysxSoftBodyMesh
// Description :
////////////////////////////////////////////////////////////////////
class EXPCL_PANDAPHYSX PhysxSoftBodyMesh : public PhysxObject {
PUBLISHED:
unsigned int get_reference_count() const;
////////////////////////////////////////////////////////////////////
PUBLISHED:
void release();
INLINE void ls() const;
INLINE void ls(ostream &out, int indent_level=0) const;
public:
INLINE PhysxSoftBodyMesh();
INLINE ~PhysxSoftBodyMesh();
INLINE NxSoftBodyMesh *ptr() const { return _ptr; };
void link(NxSoftBodyMesh *meshPtr);
void unlink();
private:
NxSoftBodyMesh *_ptr;
////////////////////////////////////////////////////////////////////
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
PhysxObject::init_type();
register_type(_type_handle, "PhysxSoftBodyMesh",
PhysxObject::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 "physxSoftBodyMesh.I"
#endif // PHYSXSOFTBODYMESH_H

View File

@ -0,0 +1,72 @@
// Filename: physxSoftBodyMeshDesc.I
// Created by: enn0x (12Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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: PhysxSoftBodyMeshDesc::Constructor
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
INLINE PhysxSoftBodyMeshDesc::
PhysxSoftBodyMeshDesc() {
_desc.flags = 0;
_desc.vertexStrideBytes = sizeof(NxVec3);
_desc.tetrahedronStrideBytes = 4*sizeof(NxU32);
_desc.vertices = NULL;
_desc.tetrahedra = NULL;
_vertices = NULL;
_tetrahedra = NULL;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMeshDesc::Destructor
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
INLINE PhysxSoftBodyMeshDesc::
~PhysxSoftBodyMeshDesc() {
if (_vertices) {
delete [] _vertices;
}
if (_tetrahedra) {
delete [] _tetrahedra;
}
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMeshDesc::is_valid
// Access: Published
// Description: Returns true if the descriptor is valid.
////////////////////////////////////////////////////////////////////
INLINE bool PhysxSoftBodyMeshDesc::
is_valid() const {
return _desc.isValid();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMeshDesc::get_desc
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
INLINE const NxSoftBodyMeshDesc &PhysxSoftBodyMeshDesc::
get_desc() const {
return _desc;
}

View File

@ -0,0 +1,96 @@
// Filename: physxSoftBodyMeshDesc.cxx
// Created by: enn0x (12Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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 "physxSoftBodyMeshDesc.h"
#include "physxManager.h"
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMeshDesc::set_num_vertices
// Access: Published
// Description: Sets the number of vertices to be stored within
// this soft body mesh. The function allocates memory
// for the vertices, but it does not set any vertices.
//
// This method must be called before any calls to
// set_vertex are done!
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyMeshDesc::
set_num_vertices(unsigned int numVertices) {
// Vertices
if (_desc.vertices) {
delete [] _vertices;
}
_vertices = new NxVec3[numVertices];
_desc.numVertices = numVertices;
_desc.vertices = _vertices;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMeshDesc::set_vertex
// Access: Published
// Description: Sets a single vertex. You have to call the function
// set_num_vertices before you can call this function.
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyMeshDesc::
set_vertex(unsigned int idx, const LPoint3f &vert) {
nassertv(_desc.numVertices > idx);
_vertices[idx] = PhysxManager::point3_to_nxVec3(vert);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMeshDesc::set_num_tetrahedra
// Access: Published
// Description: Sets the number of tetrahedra to be stored in this
// soft body mesh.
//
// This method must be called before any calls to
// set_tetrahedron are done!
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyMeshDesc::
set_num_tetrahedra(unsigned int numTetrahedra) {
if (_desc.tetrahedra) {
delete [] _tetrahedra;
}
_tetrahedra = new NxU32[4 * numTetrahedra];
_desc.numTetrahedra = numTetrahedra;
_desc.tetrahedra = _tetrahedra;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyMeshDesc::set_tetrahedron
// Access: Published
// Description: Sets a single tetrahedron, by providing the three
// indices i1, i2, i3, i4.
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyMeshDesc::
set_tetrahedron(unsigned int idx,
unsigned int i1, unsigned int i2, unsigned int i3, unsigned int i4) {
nassertv(_desc.numTetrahedra > idx);
idx = 4 * idx;
_tetrahedra[idx] = i1;
_tetrahedra[idx + 1] = i2;
_tetrahedra[idx + 2] = i3;
_tetrahedra[idx + 3] = i4;
}

View File

@ -0,0 +1,57 @@
// Filename: physxSoftBodyMeshDesc.h
// Created by: enn0x (12Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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 PHYSXSOFTBODYMESHDESC_H
#define PHYSXSOFTBODYMESHDESC_H
#include "pandabase.h"
#include "lpoint3.h"
#include "physx_includes.h"
////////////////////////////////////////////////////////////////////
// Class : PhysxSoftBodyMeshDesc
// Description :
////////////////////////////////////////////////////////////////////
class EXPCL_PANDAPHYSX PhysxSoftBodyMeshDesc {
PUBLISHED:
INLINE PhysxSoftBodyMeshDesc();
INLINE ~PhysxSoftBodyMeshDesc();
INLINE bool is_valid() const;
void set_num_vertices(unsigned int n);
void set_vertex(unsigned int idx,
const LPoint3f &vert);
void set_num_tetrahedra(unsigned int n);
void set_tetrahedron(unsigned int idx,
unsigned int i1,
unsigned int i2,
unsigned int i3,
unsigned int i4);
public:
INLINE const NxSoftBodyMeshDesc &get_desc() const;
private:
NxSoftBodyMeshDesc _desc;
NxVec3 *_vertices;
NxU32 *_tetrahedra;
};
#include "physxSoftBodyMeshDesc.I"
#endif // PHYSXSOFTBODYMESHDESC_H

View File

@ -0,0 +1,45 @@
// Filename: physxSoftBodyNode.I
// Created by: enn0x (13Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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: PhysxSoftBodyNode::Constructor
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
INLINE PhysxSoftBodyNode::
PhysxSoftBodyNode(const char *name) : GeomNode(name) {
_vdata = new GeomVertexData("", GeomVertexFormat::get_v3n3t2(), Geom::UH_stream);
_prim = new GeomTriangles(Geom::UH_stream);
_prim->set_shade_model(Geom::SM_uniform);
_geom = new Geom(_vdata);
_geom->add_primitive(_prim);
this->add_geom(_geom);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyNode::Destructor
// Access: Published
// Description:
////////////////////////////////////////////////////////////////////
INLINE PhysxSoftBodyNode::
~PhysxSoftBodyNode() {
}

View File

@ -0,0 +1,414 @@
// Filename: physxSoftBodyNode.cxx
// Created by: enn0x (13Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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 "physxSoftBodyNode.h"
#include "physxSoftBody.h"
#include "physxFileStream.h"
#include "physxManager.h"
#include "physxMeshHash.h"
#include "geomVertexFormat.h"
#include "geomVertexWriter.h"
#include "geomVertexRewriter.h"
TypeHandle PhysxSoftBodyNode::_type_handle;
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyNode::allocate
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyNode::
allocate(PhysxSoftBody *softbody) {
_softbody = softbody;
// Retrieve number of vertices and triangles the hard way
NxSoftBodyMeshDesc meshDesc;
_softbody->ptr()->getSoftBodyMesh()->saveToDesc(meshDesc);
NxU32 numVertices = meshDesc.numVertices;
NxU32 numTetrahedra = meshDesc.numTetrahedra;
float factor = 1.0f; // TODO max(1.0f, factor);
// Reserve more memory for vertices than the initial mesh takes because
// tearing creates new vertices
NxU32 maxVertices = factor * numVertices;
_mesh.verticesPosBegin = (NxVec3 *)malloc(sizeof(NxVec3) * maxVertices);
_mesh.verticesPosByteStride = sizeof(NxVec3);
_mesh.maxVertices = maxVertices;
_mesh.numVerticesPtr = (NxU32 *)malloc(sizeof(NxU32));
// The number of tetrahedra is constant, even if the softbody is torn
NxU32 maxIndices = 4 * numTetrahedra;
_mesh.indicesBegin = (NxU32 *)malloc(sizeof(NxU32) * maxIndices);
_mesh.indicesByteStride = sizeof(NxU32);
_mesh.maxIndices = maxIndices;
_mesh.numIndicesPtr = (NxU32 *)malloc(sizeof(NxU32));
*(_mesh.numVerticesPtr) = 0;
*(_mesh.numIndicesPtr) = 0;
_softbody->ptr()->setMeshData(_mesh);
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyNode::set_from_geom
// Access: Published
// Description: Reads the vertices and indices from an existing
// Geom and makes a decomposed copy of the data.
// Then computes links between the owning soft body
// tetrahedron mesh in order to render an updated
// geometry every simulation frame.
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyNode::
set_from_geom(const Geom *geom) {
_prim->clear_vertices();
GeomVertexWriter vwriter = GeomVertexWriter(_vdata, InternalName::get_vertex());
GeomVertexWriter nwriter = GeomVertexWriter(_vdata, InternalName::get_normal());
GeomVertexWriter twriter = GeomVertexWriter(_vdata, InternalName::get_texcoord());
CPT(GeomVertexData) vdata = geom->get_vertex_data();
GeomVertexReader vreader = GeomVertexReader(vdata, InternalName::get_vertex());
GeomVertexReader nreader = GeomVertexReader(vdata, InternalName::get_normal());
GeomVertexReader treader = GeomVertexReader(vdata, InternalName::get_texcoord());
while (!vreader.is_at_end()) {
LVecBase3f v = vreader.get_data3f();
vwriter.add_data3f(v.get_x(), v.get_y(), v.get_z());
}
while (!nreader.is_at_end()) {
LVecBase3f n = nreader.get_data3f();
nwriter.add_data3f(n.get_x(), n.get_y(), n.get_z());
}
while (!treader.is_at_end()) {
LVecBase2f t = treader.get_data2f();
twriter.add_data2f(t.get_x(), t.get_y());
}
for (int i=0; i<geom->get_num_primitives(); i++) {
CPT(GeomPrimitive) prim = geom->get_primitive(i);
prim = prim->decompose();
for (int j=0; j<prim->get_num_primitives(); j++) {
int s = prim->get_primitive_start(j);
int e = prim->get_primitive_end(j);
for (int l=s; l<e; l++) {
_prim->add_vertex(prim->get_vertex(l));
}
}
}
_prim->close_primitive();
update_bounds();
build_tetra_links();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyNode::build_tetra_links
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyNode::
build_tetra_links() {
NxSoftBodyMeshDesc meshDesc;
_softbody->ptr()->getSoftBodyMesh()->saveToDesc(meshDesc);
const NxVec3 *vertices = (const NxVec3 *) meshDesc.vertices;
const NxU32 *indices = (const NxU32 *) meshDesc.tetrahedra;
const NxU32 numTets = meshDesc.numTetrahedra;
_tetraLinks.clear();
PhysxMeshHash* hash = new PhysxMeshHash();
hash->set_grid_spacing(_bounds.min.distance(_bounds.max) * 0.1f);
for (NxU32 i=0; i<numTets; i++) {
const NxU32 *ix = &indices[4*i];
NxBounds3 tetraBounds;
tetraBounds.setEmpty();
tetraBounds.include(vertices[*ix++]);
tetraBounds.include(vertices[*ix++]);
tetraBounds.include(vertices[*ix++]);
tetraBounds.include(vertices[*ix++]);
hash->add(tetraBounds, i);
}
GeomVertexReader vreader = GeomVertexReader(_vdata, InternalName::get_vertex());
while (!vreader.is_at_end()) {
// Prepare datastructure for drained tetras
_drainedTriVertices.push_back(false);
TetraLink tmpLink;
LVecBase3f v = vreader.get_data3f();
NxVec3 triVert = PhysxManager::vec3_to_nxVec3(v);
pvector<int> itemIndices;
hash->query_unique(triVert, itemIndices);
NxReal minDist = 0.0f;
NxVec3 b;
int num, isize;
num = isize = itemIndices.size();
if (num == 0) {
num = numTets;
}
for (int i=0; i<num; i++) {
int j = i;
if (isize > 0) {
j = itemIndices[i];
}
const NxU32 *ix = &indices[j*4];
const NxVec3 &p0 = vertices[*ix++];
const NxVec3 &p1 = vertices[*ix++];
const NxVec3 &p2 = vertices[*ix++];
const NxVec3 &p3 = vertices[*ix++];
NxVec3 b = compute_bary_coords(triVert, p0, p1, p2, p3);
// Is the vertex inside the tetrahedron? If yes we take it
if (b.x >= 0.0f && b.y >= 0.0f && b.z >= 0.0f && (b.x + b.y + b.z) <= 1.0f) {
tmpLink.barycentricCoords = b;
tmpLink.tetraNr = j;
break;
}
// Otherwise, if we are not in any tetrahedron we take the closest one
NxReal dist = 0.0f;
if (b.x + b.y + b.z > 1.0f) dist = b.x + b.y + b.z - 1.0f;
if (b.x < 0.0f) dist = (-b.x < dist) ? dist : -b.x;
if (b.y < 0.0f) dist = (-b.y < dist) ? dist : -b.y;
if (b.z < 0.0f) dist = (-b.z < dist) ? dist : -b.z;
if (i == 0 || dist < minDist) {
minDist = dist;
tmpLink.barycentricCoords = b;
tmpLink.tetraNr = j;
}
}
_tetraLinks.push_back(tmpLink);
}
delete hash;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyNode::remove_tris_related_to_vertex
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyNode::
remove_tris_related_to_vertex(const int vertexIndex) {
GeomVertexRewriter vrewriter = GeomVertexRewriter(_vdata, InternalName::get_vertex());
LVecBase3f v;
for (int j=0; j<_prim->get_num_primitives(); j++) {
int s = _prim->get_primitive_start(j);
int idx0 = _prim->get_vertex(s);
int idx1 = _prim->get_vertex(s+1);
int idx2 = _prim->get_vertex(s+2);
if (vertexIndex == idx0 || vertexIndex == idx1 || vertexIndex == idx2) {
// Make this triangle degenerated
vrewriter.set_row(idx0); v = vrewriter.get_data3f();
vrewriter.set_row(idx1); vrewriter.set_data3f(v.get_x(), v.get_y(), v.get_z());
vrewriter.set_row(idx2); vrewriter.set_data3f(v.get_x(), v.get_y(), v.get_z());
}
}
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyNode::update_bounds
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyNode::
update_bounds() {
_bounds.setEmpty();
GeomVertexReader vreader = GeomVertexReader(_vdata, InternalName::get_vertex());
while (!vreader.is_at_end()) {
LVecBase3f v = vreader.get_data3f();
_bounds.include(PhysxManager::vec3_to_nxVec3(v));
}
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyNode::update_normals
// Access: Public
// Description:_bounds.include(mVertices[i]);
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyNode::
update_normals() {
_normals.resize(_vdata->get_num_rows());
int i;
for (i=0; i<(int)_normals.size(); i++) {
_normals[i] = LVector3f::zero();
}
LVecBase3f n, v0, v1, v2;
GeomVertexReader vreader = GeomVertexReader(_vdata, InternalName::get_vertex());
for (int j=0; j<_prim->get_num_primitives(); j++) {
int s = _prim->get_primitive_start(j);
int idx0 = _prim->get_vertex(s);
int idx1 = _prim->get_vertex(s+1);
int idx2 = _prim->get_vertex(s+2);
vreader.set_row(idx0); v0 = vreader.get_data3f();
vreader.set_row(idx1); v1 = vreader.get_data3f();
vreader.set_row(idx2); v2 = vreader.get_data3f();
n = (v1 - v0).cross(v2 - v0);
_normals[idx0] += n;
_normals[idx1] += n;
_normals[idx2] += n;
}
for (i=0; i<(int)_normals.size(); i++) {
_normals[i].normalize();
}
GeomVertexWriter nwriter = GeomVertexWriter(_vdata, InternalName::get_normal());
for (i=0; i<(int)_normals.size(); i++) {
n = _normals[i];
nwriter.add_data3f(n.get_x(), n.get_y(), n.get_z());
}
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyNode::compute_bary_coords
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
NxVec3 PhysxSoftBodyNode::
compute_bary_coords(NxVec3 vertex, NxVec3 p0, NxVec3 p1, NxVec3 p2, NxVec3 p3) const {
NxVec3 baryCoords;
NxVec3 q = vertex - p3;
NxVec3 q0 = p0 - p3;
NxVec3 q1 = p1 - p3;
NxVec3 q2 = p2 - p3;
NxMat33 m;
m.setColumn(0, q0);
m.setColumn(1, q1);
m.setColumn(2, q2);
NxReal det = m.determinant();
m.setColumn(0, q);
baryCoords.x = m.determinant();
m.setColumn(0, q0);
m.setColumn(1, q);
baryCoords.y = m.determinant();
m.setColumn(1, q1);
m.setColumn(2,q);
baryCoords.z = m.determinant();
if (det != 0.0f) {
baryCoords /= det;
}
return baryCoords;
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyNode::update
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
void PhysxSoftBodyNode::
update() {
update_tetra_links();
}
////////////////////////////////////////////////////////////////////
// Function: PhysxSoftBodyNode::update_tetra_links
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
bool PhysxSoftBodyNode::
update_tetra_links() {
if (_tetraLinks.size() != _vdata->get_num_rows())
{
return false;
}
NxU32 numVertices = *_mesh.numVerticesPtr;
NxU32 numTetrahedra = *_mesh.numIndicesPtr / 4;
const NxVec3 *vertices = (NxVec3*)_mesh.verticesPosBegin;
NxU32* indices = (NxU32*)_mesh.indicesBegin;
GeomVertexRewriter vwriter = GeomVertexRewriter(_vdata, InternalName::get_vertex());
int i = 0;
while (!vwriter.is_at_end()) {
TetraLink &link = _tetraLinks[i];
if (!_drainedTriVertices[i]) {
const NxU32 *ix = &indices[4*link.tetraNr];
if (*ix == *(ix + 1)) {
remove_tris_related_to_vertex(i);
_drainedTriVertices[i] = true;
continue;
}
const NxVec3 &p0 = vertices[*ix++];
const NxVec3 &p1 = vertices[*ix++];
const NxVec3 &p2 = vertices[*ix++];
const NxVec3 &p3 = vertices[*ix++];
NxVec3 &b = link.barycentricCoords;
NxVec3 tmp = p0 * b.x + p1 * b.y + p2 * b.z + p3 * (1.0f - b.x - b.y - b.z);
vwriter.set_data3f(tmp.x, tmp.y, tmp.z);
}
i++;
}
update_normals();
return true;
}

View File

@ -0,0 +1,99 @@
// Filename: physxSoftBodyNode.h
// Created by: enn0x (13Sep10)
//
////////////////////////////////////////////////////////////////////
//
// 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 PHYSXSOFTBODYNODE_H
#define PHYSXSOFTBODYNODE_H
#include "pandabase.h"
#include "pointerTo.h"
#include "geomNode.h"
#include "transformState.h"
#include "geom.h"
#include "geomVertexData.h"
#include "geomTriangles.h"
#include "filename.h"
#include "physx_includes.h"
class PhysxSoftBody;
////////////////////////////////////////////////////////////////////
// Class : PhysxSoftBodyNode
// Description : Renderable geometry which represents a soft body
// mesh.
////////////////////////////////////////////////////////////////////
class EXPCL_PANDAPHYSX PhysxSoftBodyNode : public GeomNode {
PUBLISHED:
INLINE PhysxSoftBodyNode(const char *name);
INLINE ~PhysxSoftBodyNode();
void set_from_geom(const Geom *geom);
public:
void allocate(PhysxSoftBody *cloth);
void update();
private:
struct TetraLink {
int tetraNr;
NxVec3 barycentricCoords;
};
void update_bounds();
void build_tetra_links();
bool update_tetra_links();
void update_normals();
void remove_tris_related_to_vertex(const int vertexIndex);
NxVec3 compute_bary_coords(NxVec3 vertex, NxVec3 p0, NxVec3 p1, NxVec3 p2, NxVec3 p3) const;
pvector<TetraLink> _tetraLinks;
pvector<bool> _drainedTriVertices;
pvector<LVecBase3f> _normals;
NxBounds3 _bounds;
NxMeshData _mesh;
PT(GeomVertexData) _vdata;
PT(Geom) _geom;
PT(GeomTriangles) _prim;
PT(PhysxSoftBody) _softbody;
////////////////////////////////////////////////////////////////////
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
GeomNode::init_type();
register_type(_type_handle, "PhysxSoftBodyNode",
GeomNode::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 "physxSoftBodyNode.I"
#endif // PHYSXSOFTBODYNODE_H

View File

@ -23,6 +23,7 @@
class PhysxActor;
class PhysxWheel;
class PhysxVehicleDesc;
class PhysxScene;
////////////////////////////////////////////////////////////////////

View File

@ -21,6 +21,7 @@
#include "physx_includes.h"
class PhysxWheelShapeDesc;
class PhysxSpringDesc;
////////////////////////////////////////////////////////////////////
// Class : PhysxWheelShape

View File

@ -70,6 +70,7 @@
#include "physxMaterialDesc.cxx"
#include "physxMemoryReadBuffer.cxx"
#include "physxMemoryWriteBuffer.cxx"
#include "physxMeshHash.cxx"
#include "physxMeshPool.cxx"
#include "physxMotorDesc.cxx"
#include "physxObject.cxx"
@ -97,6 +98,11 @@
#include "physxSegment.cxx"
#include "physxShape.cxx"
#include "physxShapeDesc.cxx"
#include "physxSoftBody.cxx"
#include "physxSoftBodyDesc.cxx"
#include "physxSoftBodyMesh.cxx"
#include "physxSoftBodyMeshDesc.cxx"
#include "physxSoftBodyNode.cxx"
#include "physxSphere.cxx"
#include "physxSphereForceFieldShape.cxx"
#include "physxSphereForceFieldShapeDesc.cxx"

View File

@ -18,8 +18,12 @@
// Platform-specific defines
#ifdef WIN32
#if _WIN64 || __amd64__
#define NX64 1
#else
#define NX32 1
#endif
#endif
#ifdef IS_LINUX
#define LINUX 1
@ -30,6 +34,7 @@
#endif
#define CORELIB 1
#define NX_DISABLE_FLUIDS 1
#define NX_DISABLE_HARDWARE 1
#endif
#ifdef IS_FREEBSD