diff --git a/Extras/MayaPlugin/BulletMayaPlugin.vcproj b/Extras/MayaPlugin/BulletMayaPlugin.vcproj index 718cf5fd3..d8d9e7ca3 100644 --- a/Extras/MayaPlugin/BulletMayaPlugin.vcproj +++ b/Extras/MayaPlugin/BulletMayaPlugin.vcproj @@ -115,6 +115,7 @@ setLocalScaling(btVector3(s[0], s[1], s[2])); + virtual void set_scale(vec3f const& s1) { + // shape()->setLocalScaling(btVector3(s[0], s[1], s[2])); + btVector3 s(s1[0],s1[1],s1[2]); + + float delSq = 0.f; + for(int i = 0; i < 3; i++) + { + float del = s[i] - m_cachedScaling[i]; + delSq += del * del; + } + if (delSq > FLT_EPSILON) + { +// btAssert(shape()->getType()== + btCompoundShape* compound =(btCompoundShape*)shape(); + btConvexHullShape* child = (btConvexHullShape*)compound->getChildShape(0); +/* + btTransform scaleTransf; + scaleTransf.setIdentity(); + scaleTransf.getBasis()[0][0] = (s/m_cachedScaling)[0]; + scaleTransf.getBasis()[1][1] = (s/m_cachedScaling)[1]; + scaleTransf.getBasis()[2][2] = (s/m_cachedScaling)[2]; + btTransform combinedTr = tr.inverse() * (scaleTransf * (tr * vtx)); +*/ + const btTransform& tr = compound->getChildTransform(0); + for (int i=0;igetNumPoints();i++) + { + btVector3 oldPoint = child->getUnscaledPoints()[i]; + btVector3 parentPoint = tr*oldPoint; + btVector3 parentPointScaled = parentPoint*(s/m_cachedScaling); + btVector3 childPoint = tr.inverse()*parentPointScaled; + child->getUnscaledPoints()[i]=childPoint; + } + m_cachedScaling = s; + } + update(); } virtual void get_scale(vec3f& s) { - const btVector3& scale = shape()->getLocalScaling(); - s = vec3f(scale.x(), scale.y(), scale.z()); +// const btVector3& scale = shape()->getLocalScaling(); +// s = vec3f(scale.x(), scale.y(), scale.z()); + s = vec3f(m_cachedScaling.x(), m_cachedScaling.y(), m_cachedScaling.z()); } virtual float volume() { return m_volume; } @@ -103,6 +137,12 @@ protected: m_ch_shape.reset(new btConvexHullShape((float const*)&(m_vertices[0]), num_vertices, sizeof(vec3f))); btCompoundShape *compound_shape = new btCompoundShape; +// btTransform childTransf; +// childTransf.setIdentity(); +// childTransf.setOrigin(btVector3(m_center[0], m_center[1], m_center[2])); + // compound_shape->addChildShape(childTransf, m_ch_shape.get()); + +///* compound_shape->addChildShape(btTransform(btQuaternion(m_rotation[1], m_rotation[2], m_rotation[3], @@ -111,7 +151,9 @@ protected: m_center[1], m_center[2])), m_ch_shape.get()); +//*/ set_shape(compound_shape); + m_cachedScaling[0] = m_cachedScaling[1] = m_cachedScaling[2] = 1.f; } void update() @@ -147,6 +189,7 @@ private: vec3f m_center; quatf m_rotation; vec3f m_local_inertia; + btVector3 m_cachedScaling; }; #endif diff --git a/Extras/MayaPlugin/bt_solver.cpp b/Extras/MayaPlugin/bt_solver.cpp index 1b4f1d4f5..fb1bc80fa 100644 --- a/Extras/MayaPlugin/bt_solver.cpp +++ b/Extras/MayaPlugin/bt_solver.cpp @@ -21,30 +21,44 @@ Written by: Nicola Candussi Modified by Roman Ponomarev 01/22/2010 : Constraints reworked +01/27/2010 : Replaced COLLADA export with Bullet binary export */ //bt_solver.cpp +#include "LinearMath/btSerializer.h" #include "bt_solver.h" -#include "../BulletColladaConverter/ColladaConverter.h" +//#include "../BulletColladaConverter/ColladaConverter.h" +//#include "../Serialize/BulletFileLoader/btBulletFile.h" btVector3 minWorld(-10000,-10000,-10000); btVector3 maxWorld(10000,10000,10000); int maxNumObj=32768; -void bt_solver_t::export_collada_file(const char* fileName) +void bt_solver_t::export_bullet_file(const char* fileName) { - ColladaConverter tmpConverter(m_dynamicsWorld.get()); - tmpConverter.save(fileName); - +// ColladaConverter tmpConverter(m_dynamicsWorld.get()); +// tmpConverter.save(fileName); + FILE* f2 = fopen(fileName,"wb"); + if(f2 == NULL) + { + fprintf(stderr,"Error: Can't open file %s for writing\n", fileName); + return; + } + int maxSerializeBufferSize = 1024*1024*5; + btDefaultSerializer* serializer = new btDefaultSerializer(maxSerializeBufferSize); + m_dynamicsWorld->serialize(serializer); + fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1,f2); + fclose(f2); + delete serializer; } -void bt_solver_t::import_collada_file(const char* filename) +void bt_solver_t::import_bullet_file(const char* filename) { //todo: need to create actual bodies etc - ColladaConverter tmpConverter(m_dynamicsWorld.get()); - tmpConverter.load(filename); +// ColladaConverter tmpConverter(m_dynamicsWorld.get()); +// tmpConverter.load(filename); } diff --git a/Extras/MayaPlugin/bt_solver.h b/Extras/MayaPlugin/bt_solver.h index fad38d99e..74abcb91b 100644 --- a/Extras/MayaPlugin/bt_solver.h +++ b/Extras/MayaPlugin/bt_solver.h @@ -21,6 +21,7 @@ Written by: Nicola Candussi Modified by Roman Ponomarev 01/22/2010 : Constraints reworked +01/27/2010 : Replaced COLLADA export with Bullet binary export */ //bt_solver.h @@ -127,7 +128,7 @@ public: virtual void add_constraint(constraint_impl_t* c) { bt_constraint_t* btc = dynamic_cast(c); - m_dynamicsWorld->addConstraint(btc->constraint()); + m_dynamicsWorld->addConstraint(btc->constraint(), true); } virtual void remove_constraint(constraint_impl_t* c) @@ -151,9 +152,9 @@ public: m_dynamicsWorld->stepSimulation(dt, 1000, 1.0f / 120.0f); } - virtual void export_collada_file(const char* fileName); + virtual void export_bullet_file(const char* fileName); - virtual void import_collada_file(const char* filename); + virtual void import_bullet_file(const char* filename); protected: diff --git a/Extras/MayaPlugin/colladaExport.cpp b/Extras/MayaPlugin/bulletExport.cpp similarity index 90% rename from Extras/MayaPlugin/colladaExport.cpp rename to Extras/MayaPlugin/bulletExport.cpp index 4e292f41b..111413497 100644 --- a/Extras/MayaPlugin/colladaExport.cpp +++ b/Extras/MayaPlugin/bulletExport.cpp @@ -16,9 +16,11 @@ would be appreciated but is not required. not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. +Modified by Roman Ponomarev +01/27/2010 : Replaced COLLADA export with Bullet binary export */ -#include "colladaExport.h" +#include "bulletExport.h" #include "solver.h" #include "solver_impl.h" @@ -35,6 +37,8 @@ extern "C" int strcasecmp (const char *, const char *); ////////////////////////////////////////////////////////////// +MString ObjTranslator::fExtension = "bullet"; + ////////////////////////////////////////////////////////////// void* ObjTranslator::creator() @@ -48,7 +52,7 @@ 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"); + fprintf(stderr, "Bullet Physics import is not available yet\n"); return MS::kFailure; } @@ -76,7 +80,7 @@ MStatus ObjTranslator::writer ( const MFileObject& file, shared_ptr solv = solver_t::get_solver(); -solv->export_collada_file(fname); +solv->export_bullet_file(fname); return status; @@ -97,7 +101,8 @@ bool ObjTranslator::haveWriteMethod () const MString ObjTranslator::defaultExtension () const { - return "dae"; +// return MString("bullet"); + return fExtension; } ////////////////////////////////////////////////////////////// @@ -109,7 +114,7 @@ MPxFileTranslator::MFileKind ObjTranslator::identifyFile ( const char * name = fileName.name().asChar(); int nameLength = strlen(name); - if ((nameLength > 4) && !strcasecmp(name+nameLength-4, ".dae")) + if ((nameLength > 7) && !strcasecmp(name+nameLength-7, ".bullet")) return kCouldBeMyFileType; else return kNotMyFileType; diff --git a/Extras/MayaPlugin/colladaExport.h b/Extras/MayaPlugin/bulletExport.h similarity index 92% rename from Extras/MayaPlugin/colladaExport.h rename to Extras/MayaPlugin/bulletExport.h index be625b444..ddadea077 100644 --- a/Extras/MayaPlugin/colladaExport.h +++ b/Extras/MayaPlugin/bulletExport.h @@ -16,11 +16,13 @@ would be appreciated but is not required. not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. +Modified by Roman Ponomarev +01/27/2010 : Replaced COLLADA export with Bullet binary export */ -#ifndef COLLADA_EXPORT_H -#define COLLADA_EXPORT_H +#ifndef BULLET_EXPORT_H +#define BULLET_EXPORT_H #include #include @@ -76,6 +78,9 @@ public: MFileKind identifyFile ( const MFileObject& fileName, const char* buffer, short size) const; +protected: + static MString fExtension; + private: MStatus exportSelected(); MStatus exportAll(); @@ -85,5 +90,5 @@ private: }; -#endif //COLLADA_EXPORT_H +#endif //BULLET_EXPORT_H diff --git a/Extras/MayaPlugin/pluginMain.cpp b/Extras/MayaPlugin/pluginMain.cpp index 87b667278..876b12d1f 100644 --- a/Extras/MayaPlugin/pluginMain.cpp +++ b/Extras/MayaPlugin/pluginMain.cpp @@ -21,6 +21,7 @@ Written by: Nicola Candussi Modified by Roman Ponomarev 01/22/2010 : Constraints reworked +01/27/2010 : Replaced COLLADA export with Bullet binary export */ //pluginMain.cpp @@ -45,10 +46,10 @@ Modified by Roman Ponomarev #include "constraint/dSliderConstraintCmd.h" #include "constraint/dsixdofConstraintCmd.h" #include "mvl/util.h" -#include "colladaExport.h" +#include "bulletExport.h" -const char *const colladaOptionScript = "colladaExportOptions"; -const char *const colladaDefaultOptions = +const char *const bulletOptionScript = "bulletExportOptions"; +const char *const bulletDefaultOptions = "groups=1;" "ptgroups=1;" "materials=1;" @@ -66,12 +67,12 @@ MStatus initializePlugin( MObject obj ) // Register the translator with the system - status = plugin.registerFileTranslator( "COLLADA Physics export", "none", + status = plugin.registerFileTranslator( "Bullet Physics export", "none", ObjTranslator::creator, - (char *)colladaOptionScript, - (char *)colladaDefaultOptions ); + (char *)bulletOptionScript, + (char *)bulletDefaultOptions ); - MCHECKSTATUS(status,"registerFileTranslator COLLADA Physics export") + MCHECKSTATUS(status,"registerFileTranslator Bullet Physics export"); // @@ -226,8 +227,8 @@ MStatus uninitializePlugin( MObject obj ) status = plugin.deregisterNode(rigidBodyNode::typeId); MCHECKSTATUS(status, "deregistering rigidBodyNode") - status = plugin.deregisterFileTranslator( "COLLADA Physics export" ); - MCHECKSTATUS(status,"deregistering COLLADA Physics export" ) + status = plugin.deregisterFileTranslator( "Bullet Physics export" ); + MCHECKSTATUS(status,"deregistering Bullet Physics export" ) solver_t::cleanup(); diff --git a/Extras/MayaPlugin/solver.cpp b/Extras/MayaPlugin/solver.cpp index 3fc5b8a64..fe49edf41 100644 --- a/Extras/MayaPlugin/solver.cpp +++ b/Extras/MayaPlugin/solver.cpp @@ -21,6 +21,7 @@ Written by: Nicola Candussi Modified by Roman Ponomarev 01/22/2010 : Constraints reworked +01/27/2010 : Replaced COLLADA export with Bullet binary export */ //solver.cpp diff --git a/Extras/MayaPlugin/solver_impl.h b/Extras/MayaPlugin/solver_impl.h index 8eacf3aa9..653476ec7 100644 --- a/Extras/MayaPlugin/solver_impl.h +++ b/Extras/MayaPlugin/solver_impl.h @@ -21,6 +21,7 @@ Written by: Nicola Candussi Modified by Roman Ponomarev 01/22/2010 : Constraints reworked +01/27/2010 : Replaced COLLADA export with Bullet binary export */ //solver_impl.h @@ -76,9 +77,9 @@ public: virtual void set_split_impulse(bool enabled) = 0; - virtual void export_collada_file(const char* fileName) = 0; + virtual void export_bullet_file(const char* fileName) = 0; - virtual void import_collada_file(const char* filename) = 0; + virtual void import_bullet_file(const char* filename) = 0; virtual void step_simulation(float dt) = 0;