232 lines
7.1 KiB
C++
232 lines
7.1 KiB
C++
// Filename: physxKitchen.cxx
|
|
// Created by: enn0x (12Oct09)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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 "physxKitchen.h"
|
|
#include "physxConvexMesh.h"
|
|
#include "physxConvexMeshDesc.h"
|
|
#include "physxTriangleMesh.h"
|
|
#include "physxTriangleMeshDesc.h"
|
|
#include "physxFileStream.h"
|
|
#include "physxMemoryReadBuffer.h"
|
|
#include "physxMemoryWriteBuffer.h"
|
|
#include "physxClothMesh.h"
|
|
#include "physxClothMeshDesc.h"
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: PhysxKitchen::set_cooking_params
|
|
// Access: Published
|
|
// Description: Sets two parameters which affect mesh cooking:
|
|
//
|
|
// Skin width for convex meshes:
|
|
// Specifies the amount to inflate the convex mesh by
|
|
// when the new convex hull generator is used.
|
|
// Inflating the mesh allows the user to hide
|
|
// interpenetration errors by increasing the size of
|
|
// the collision mesh with respect to the size of the
|
|
// rendered geometry.
|
|
// Default value: 0.025f
|
|
//
|
|
// Hint to choose speed or less memory for collision
|
|
// structures.
|
|
// Default value: false
|
|
////////////////////////////////////////////////////////////////////
|
|
void PhysxKitchen::
|
|
set_cooking_params(float skinWidth, bool hintCollisionSpeed) {
|
|
|
|
NxCookingParams params;
|
|
|
|
params.targetPlatform = PLATFORM_PC;
|
|
params.skinWidth = skinWidth;
|
|
params.hintCollisionSpeed = hintCollisionSpeed;
|
|
|
|
_cooking->NxSetCookingParams(params);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: PhysxKitchen::cook_convex_mesh
|
|
// Access: Published
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
bool PhysxKitchen::
|
|
cook_convex_mesh(const PhysxConvexMeshDesc &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->NxCookConvexMesh(meshDesc.get_desc(), fs);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: PhysxKitchen::cook_triangle_mesh
|
|
// Access: Published
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
bool PhysxKitchen::
|
|
cook_triangle_mesh(const PhysxTriangleMeshDesc &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->NxCookTriangleMesh(meshDesc.get_desc(), fs);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: PhysxKitchen::cook_cloth_mesh
|
|
// Access: Published
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
bool PhysxKitchen::
|
|
cook_cloth_mesh(const PhysxClothMeshDesc &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->NxCookClothMesh(meshDesc.get_desc(), fs);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: PhysxKitchen::cook_texcoords
|
|
// Access: Published
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
bool PhysxKitchen::
|
|
cook_texcoords(const PhysxClothMeshDesc &meshDesc, const Filename &filename) {
|
|
|
|
nassertr_always(!filename.empty(), false);
|
|
nassertr_always(filename.touch(), false);
|
|
nassertr_always(meshDesc.is_valid(), false);
|
|
|
|
const plist<LPoint2f> texcoords = meshDesc.get_texcoords();
|
|
|
|
// Write texcoords to binary file
|
|
PhysxFileStream fs = PhysxFileStream(filename.c_str(), false);
|
|
|
|
// Header
|
|
fs.storeByte('N');
|
|
fs.storeByte('X');
|
|
fs.storeByte('S');
|
|
fs.storeByte(1);
|
|
fs.storeByte('T');
|
|
fs.storeByte('E');
|
|
fs.storeByte('X');
|
|
fs.storeByte('C');
|
|
fs.storeByte(1);
|
|
|
|
// Size
|
|
fs.storeDword(texcoords.size());
|
|
|
|
// Texcoords
|
|
plist<LPoint2f>::const_iterator it;
|
|
for(it=texcoords.begin(); it!=texcoords.end(); it++) {
|
|
LPoint2f v = *it;
|
|
|
|
fs.storeFloat(v.get_x());
|
|
fs.storeFloat(v.get_y());
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: PhysxKitchen::cook_convex_mesh
|
|
// Access: Published
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
PhysxConvexMesh *PhysxKitchen::
|
|
cook_convex_mesh(const PhysxConvexMeshDesc &meshDesc) {
|
|
|
|
nassertr_always(meshDesc.is_valid(), false);
|
|
|
|
PhysxMemoryWriteBuffer buffer;
|
|
bool status = _cooking->NxCookConvexMesh(meshDesc.get_desc(), buffer);
|
|
nassertr(status, NULL);
|
|
|
|
NxPhysicsSDK *sdk = NxGetPhysicsSDK();
|
|
nassertr(sdk, NULL);
|
|
|
|
PhysxConvexMesh *mesh = new PhysxConvexMesh();
|
|
nassertr(mesh, NULL);
|
|
|
|
NxConvexMesh *meshPtr = sdk->createConvexMesh(PhysxMemoryReadBuffer(buffer.data));
|
|
nassertr(meshPtr, NULL);
|
|
|
|
mesh->link(meshPtr);
|
|
|
|
return mesh;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: PhysxKitchen::cook_triangle_mesh
|
|
// Access: Published
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
PhysxTriangleMesh *PhysxKitchen::
|
|
cook_triangle_mesh(const PhysxTriangleMeshDesc &meshDesc) {
|
|
|
|
nassertr_always(meshDesc.is_valid(), false);
|
|
|
|
PhysxMemoryWriteBuffer buffer;
|
|
bool status = _cooking->NxCookTriangleMesh(meshDesc.get_desc(), buffer);
|
|
nassertr(status, NULL);
|
|
|
|
NxPhysicsSDK *sdk = NxGetPhysicsSDK();
|
|
nassertr(sdk, NULL);
|
|
|
|
PhysxTriangleMesh *mesh = new PhysxTriangleMesh();
|
|
nassertr(mesh, NULL);
|
|
|
|
NxTriangleMesh *meshPtr = sdk->createTriangleMesh(PhysxMemoryReadBuffer(buffer.data));
|
|
nassertr(meshPtr, NULL);
|
|
|
|
mesh->link(meshPtr);
|
|
|
|
return mesh;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: PhysxKitchen::cook_cloth_mesh
|
|
// Access: Published
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
PhysxClothMesh *PhysxKitchen::
|
|
cook_cloth_mesh(const PhysxClothMeshDesc &meshDesc) {
|
|
|
|
nassertr_always(meshDesc.is_valid(), false);
|
|
|
|
PhysxMemoryWriteBuffer wbuffer;
|
|
bool status = _cooking->NxCookClothMesh(meshDesc.get_desc(), wbuffer);
|
|
nassertr(status, NULL);
|
|
|
|
NxPhysicsSDK *sdk = NxGetPhysicsSDK();
|
|
nassertr(sdk, NULL);
|
|
|
|
PhysxClothMesh *mesh = new PhysxClothMesh();
|
|
nassertr(mesh, NULL);
|
|
|
|
PhysxMemoryReadBuffer rbuffer(wbuffer.data);
|
|
NxClothMesh *meshPtr = sdk->createClothMesh(rbuffer);
|
|
nassertr(meshPtr, NULL);
|
|
|
|
mesh->link(meshPtr);
|
|
|
|
return mesh;
|
|
}
|
|
|