From c30a8bf1548ee67b95019a6be338780c1354cd1b Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Fri, 19 Sep 2008 07:14:48 +0000 Subject: [PATCH] added COLLADA Physics export. import will follow soon. Note that the exporter/importer doesn't handle GIMPACT and btStaticPlaneShape yet. --- Extras/MayaPlugin/Makefile | 4 +- Extras/MayaPlugin/Makefile.mac | 4 +- Extras/MayaPlugin/bt_solver.cpp | 28 +++++- Extras/MayaPlugin/bt_solver.h | 5 + Extras/MayaPlugin/colladaExport.cpp | 148 ++++++++++++++++++++++++++++ Extras/MayaPlugin/colladaExport.h | 89 +++++++++++++++++ Extras/MayaPlugin/pluginMain.cpp | 26 ++++- Extras/MayaPlugin/solver.cpp | 6 ++ Extras/MayaPlugin/solver.h | 2 + Extras/MayaPlugin/solver_impl.h | 4 + 10 files changed, 306 insertions(+), 10 deletions(-) create mode 100644 Extras/MayaPlugin/colladaExport.cpp create mode 100644 Extras/MayaPlugin/colladaExport.h diff --git a/Extras/MayaPlugin/Makefile b/Extras/MayaPlugin/Makefile index 13b2ebb74..6e16135c1 100644 --- a/Extras/MayaPlugin/Makefile +++ b/Extras/MayaPlugin/Makefile @@ -28,7 +28,7 @@ LDFLAGS =-Wl,-Bsymbolic -shared BULLET_INCLUDE=-I$(BULLET)/src -I$(BULLET)/Extras/GIMPACT/include BULLET_LIB=-L$(BULLET)/out/linux/optimize/libs -L$(BULLET)/src \ - -lGIMPACT -lGIMPACTUtils -lbulletdynamics \ + -lBulletColladaConverter -lcolladadom -llibxml -lGIMPACT -lGIMPACTUtils -lbulletdynamics \ -lbulletmath -lbulletcollision -lbulletopenglsupport GL_LIB=-lGL -lGLU @@ -36,7 +36,7 @@ GL_LIB=-lGL -lGLU MAYA_INCLUDE=-I$(MAYA)/include MAYA_LIB=-L$(MAYA)/lib -lOpenMaya -lFoundation -lOpenMayaUI -lOpenMayaFX -SOURCES = pluginMain.cpp rigidBodyNode.cpp rigidBodyArrayNode.cpp collisionShapeNode.cpp \ +SOURCES = pluginMain.cpp colladaExport.cpp rigidBodyNode.cpp rigidBodyArrayNode.cpp collisionShapeNode.cpp \ solver.cpp bt_solver.cpp dSolverNode.cpp dSolverCmd.cpp dRigidBodyCmd.cpp dRigidBodyArrayCmd.cpp \ pdbIO.cpp drawUtils.cpp diff --git a/Extras/MayaPlugin/Makefile.mac b/Extras/MayaPlugin/Makefile.mac index 78b0adf7f..372708106 100644 --- a/Extras/MayaPlugin/Makefile.mac +++ b/Extras/MayaPlugin/Makefile.mac @@ -30,7 +30,7 @@ LDFLAGS =-bundle -ldl -shared BULLET_INCLUDE=-I$(BULLET)/src -I$(BULLET)/Extras/GIMPACT/include BULLET_LIB=-L$(BULLET)/out/macosxx86/optimize/libs -L$(BULLET)/src \ - -lGIMPACT -lGIMPACTUtils -lbulletdynamics \ + -lBulletColladaConverter -lcolladadom -llibxml -lGIMPACT -lGIMPACTUtils -lbulletdynamics \ -lbulletmath -lbulletcollision -lbulletopenglsupport GL_LIB=-framework OpenGL @@ -38,7 +38,7 @@ GL_LIB=-framework OpenGL MAYA_INCLUDE=-I$(MAYA)/include MAYA_LIB=-L/Applications/Autodesk/maya2008/Maya.app/Contents/MacOS -lOpenMaya -lFoundation -Wl,-executable_path,/Applications/Autodesk/maya2008/Maya.app/Contents/MacOS -lOpenMayaUI -lOpenMayaFX -lOpenMaya -lFoundation -SOURCES = pluginMain.cpp rigidBodyNode.cpp rigidBodyArrayNode.cpp collisionShapeNode.cpp \ +SOURCES = pluginMain.cpp colladaExport.cpp rigidBodyNode.cpp rigidBodyArrayNode.cpp collisionShapeNode.cpp \ solver.cpp bt_solver.cpp dSolverNode.cpp dSolverCmd.cpp dRigidBodyCmd.cpp dRigidBodyArrayCmd.cpp \ pdbIO.cpp drawUtils.cpp diff --git a/Extras/MayaPlugin/bt_solver.cpp b/Extras/MayaPlugin/bt_solver.cpp index 62698343d..b4a4bef82 100644 --- a/Extras/MayaPlugin/bt_solver.cpp +++ b/Extras/MayaPlugin/bt_solver.cpp @@ -23,15 +23,32 @@ Written by: Nicola Candussi //bt_solver.cpp #include "bt_solver.h" +#include "../BulletColladaConverter/ColladaConverter.h" + +btVector3 minWorld(-10000,-10000,-10000); +btVector3 maxWorld(10000,10000,10000); +int maxNumObj=32768; -btVector3 worldAabbMin(-10000, -10000, -10000); -btVector3 worldAabbMax(10000, 10000, 10000); -int maxProxies = 32000; +void bt_solver_t::export_collada_file(const char* fileName) +{ + ColladaConverter tmpConverter(m_dynamicsWorld.get()); + tmpConverter.save(fileName); + +} + +void bt_solver_t::import_collada_file(const char* filename) +{ +//todo: need to create actual bodies etc + ColladaConverter tmpConverter(m_dynamicsWorld.get()); + tmpConverter.load(filename); +} + bt_solver_t::bt_solver_t(): - m_broadphase(new btAxisSweep3(worldAabbMin, worldAabbMax, maxProxies)), - m_solver(new btSequentialImpulseConstraintSolver), +// m_broadphase(new btAxisSweep3(minWorld,maxWorld,maxNumObj)), + m_broadphase(new btDbvtBroadphase()), + m_solver(new btSequentialImpulseConstraintSolver), m_collisionConfiguration(new btDefaultCollisionConfiguration), m_dispatcher(new btCollisionDispatcher(m_collisionConfiguration.get())), m_dynamicsWorld(new btDiscreteDynamicsWorld(m_dispatcher.get(), @@ -39,6 +56,7 @@ bt_solver_t::bt_solver_t(): m_solver.get(), m_collisionConfiguration.get())) { + //register algorithm for concave meshes btGImpactCollisionAlgorithm::registerAlgorithm(m_dispatcher.get()); diff --git a/Extras/MayaPlugin/bt_solver.h b/Extras/MayaPlugin/bt_solver.h index cd58e525d..860e0cbbe 100644 --- a/Extras/MayaPlugin/bt_solver.h +++ b/Extras/MayaPlugin/bt_solver.h @@ -98,6 +98,11 @@ public: m_dynamicsWorld->stepSimulation(dt, 1000, 1.0 / 120.0); } + virtual void export_collada_file(const char* fileName); + + virtual void import_collada_file(const char* filename); + + protected: friend class solver_t; bt_solver_t(); diff --git a/Extras/MayaPlugin/colladaExport.cpp b/Extras/MayaPlugin/colladaExport.cpp new file mode 100644 index 000000000..4e292f41b --- /dev/null +++ b/Extras/MayaPlugin/colladaExport.cpp @@ -0,0 +1,148 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +*/ + +#include "colladaExport.h" +#include "solver.h" +#include "solver_impl.h" + +#if defined (_WIN32) +#define strcasecmp stricmp +#elif defined (OSMac_) +extern "C" int strcasecmp (const char *, const char *); + +#endif + +#define NO_SMOOTHING_GROUP -1 +#define INITIALIZE_SMOOTHING -2 +#define INVALID_ID -1 + +////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////// + +void* ObjTranslator::creator() +{ + return new ObjTranslator(); +} + +////////////////////////////////////////////////////////////// + +MStatus ObjTranslator::reader ( const MFileObject& file, + const MString& options, + FileAccessMode mode) +{ + fprintf(stderr, "COLLADA Physics import will be available very soon, please stay tuned.\n"); + return MS::kFailure; +} + + + +MStatus ObjTranslator::writer ( const MFileObject& file, + const MString& options, + FileAccessMode mode ) + +{ + MStatus status; + + MString mname = file.fullName(), unitName; + +//just pass in the filename + +#if defined (OSMac_) + char fname[256];//MAXPATHLEN]; + strcpy (fname, file.fullName().asChar()); +// fp = fopen(fname,"wb");//MAYAMACTODO +#else + const char *fname = mname.asChar(); + // fp = fopen(fname,"w"); +#endif + +shared_ptr solv = solver_t::get_solver(); + +solv->export_collada_file(fname); + +return status; + +} +////////////////////////////////////////////////////////////// + +bool ObjTranslator::haveReadMethod () const +{ + return true; +} +////////////////////////////////////////////////////////////// + +bool ObjTranslator::haveWriteMethod () const +{ + return true; +} +////////////////////////////////////////////////////////////// + +MString ObjTranslator::defaultExtension () const +{ + return "dae"; +} +////////////////////////////////////////////////////////////// + +MPxFileTranslator::MFileKind ObjTranslator::identifyFile ( + const MFileObject& fileName, + const char* buffer, + short size) const +{ + const char * name = fileName.name().asChar(); + int nameLength = strlen(name); + + if ((nameLength > 4) && !strcasecmp(name+nameLength-4, ".dae")) + return kCouldBeMyFileType; + else + return kNotMyFileType; +} +////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////// +MStatus ObjTranslator::exportSelected( ) +{ + MStatus status; + MString filename; + + + // Create an iterator for the active selection list + // + MSelectionList slist; + MGlobal::getActiveSelectionList( slist ); + MItSelectionList iter( slist ); + + if (iter.isDone()) { + fprintf(stderr,"Error: Nothing is selected.\n"); + return MS::kFailure; + } + + + return status; +} + +////////////////////////////////////////////////////////////// + +MStatus ObjTranslator::exportAll( ) +{ + MStatus status = MS::kSuccess; + + return status; +} diff --git a/Extras/MayaPlugin/colladaExport.h b/Extras/MayaPlugin/colladaExport.h new file mode 100644 index 000000000..be625b444 --- /dev/null +++ b/Extras/MayaPlugin/colladaExport.h @@ -0,0 +1,89 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising +from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must +not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +*/ + + +#ifndef COLLADA_EXPORT_H +#define COLLADA_EXPORT_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include + + +////////////////////////////////////////////////////////////// +class ObjTranslator : public MPxFileTranslator { +public: + ObjTranslator () {}; + virtual ~ObjTranslator () {}; + static void* creator(); + + MStatus reader ( const MFileObject& file, + const MString& optionsString, + FileAccessMode mode); + + MStatus writer ( const MFileObject& file, + const MString& optionsString, + FileAccessMode mode ); + bool haveReadMethod () const; + bool haveWriteMethod () const; + MString defaultExtension () const; + MFileKind identifyFile ( const MFileObject& fileName, + const char* buffer, + short size) const; +private: + MStatus exportSelected(); + MStatus exportAll(); + +private: + +}; + + +#endif //COLLADA_EXPORT_H + diff --git a/Extras/MayaPlugin/pluginMain.cpp b/Extras/MayaPlugin/pluginMain.cpp index 659893554..e65588fd8 100644 --- a/Extras/MayaPlugin/pluginMain.cpp +++ b/Extras/MayaPlugin/pluginMain.cpp @@ -34,6 +34,17 @@ Written by: Nicola Candussi #include "dRigidBodyCmd.h" #include "dRigidBodyArrayCmd.h" #include "mvl/util.h" +#include "colladaExport.h" + +const char *const colladaOptionScript = "colladaExportOptions"; +const char *const colladaDefaultOptions = + "groups=1;" + "ptgroups=1;" + "materials=1;" + "smoothing=1;" + "normals=1;" + ; + MStatus initializePlugin( MObject obj ) { @@ -42,7 +53,17 @@ MStatus initializePlugin( MObject obj ) solver_t::initialize(); - // + +// Register the translator with the system + status = plugin.registerFileTranslator( "COLLADA Physics export", "none", + ObjTranslator::creator, + (char *)colladaOptionScript, + (char *)colladaDefaultOptions ); + + MCHECKSTATUS(status,"registerFileTranslator COLLADA Physics export") + + +// status = plugin.registerNode( rigidBodyNode::typeName, rigidBodyNode::typeId, rigidBodyNode::creator, rigidBodyNode::initialize, @@ -121,6 +142,9 @@ MStatus uninitializePlugin( MObject obj ) status = plugin.deregisterNode(rigidBodyNode::typeId); MCHECKSTATUS(status, "deregistering rigidBodyNode") + status = plugin.deregisterFileTranslator( "OBJexport" ); + MCHECKSTATUS(status,"deregistering OBJexport" ) + solver_t::cleanup(); return status; diff --git a/Extras/MayaPlugin/solver.cpp b/Extras/MayaPlugin/solver.cpp index 23c949432..4459fa292 100644 --- a/Extras/MayaPlugin/solver.cpp +++ b/Extras/MayaPlugin/solver.cpp @@ -28,6 +28,12 @@ Written by: Nicola Candussi shared_ptr solver_t::m_impl; std::set solver_t::m_rigid_bodies; +shared_ptr solver_t::get_solver() +{ + return m_impl; +} + + void solver_t::initialize() { diff --git a/Extras/MayaPlugin/solver.h b/Extras/MayaPlugin/solver.h index dd6dfacbb..479ff3be6 100644 --- a/Extras/MayaPlugin/solver.h +++ b/Extras/MayaPlugin/solver.h @@ -77,6 +77,8 @@ public: // static void step_simulation(float dt); + static shared_ptr get_solver(); + private: static shared_ptr m_impl; static std::set m_rigid_bodies; diff --git a/Extras/MayaPlugin/solver_impl.h b/Extras/MayaPlugin/solver_impl.h index 39e3c04dc..24616b651 100644 --- a/Extras/MayaPlugin/solver_impl.h +++ b/Extras/MayaPlugin/solver_impl.h @@ -55,6 +55,10 @@ public: virtual void set_split_impulse(bool enabled) = 0; + virtual void export_collada_file(const char* fileName) = 0; + + virtual void import_collada_file(const char* filename) = 0; + virtual void step_simulation(float dt) = 0; public: