diff --git a/Extras/MayaPlugin/Makefile b/Extras/MayaPlugin/Makefile new file mode 100644 index 000000000..134c96a5f --- /dev/null +++ b/Extras/MayaPlugin/Makefile @@ -0,0 +1,88 @@ + +#Dynamica Makefile + +CPP = g++412 +LD = ld + +CPPFLAGS = -DBits64_ -m64 -DUNIX -D_BOOL -DLINUX -DFUNCPROTO -D_GNU_SOURCE -DLINUX_64 -fPIC \ + -fno-strict-aliasing -DREQUIRE_IOSTREAM -Wno-deprecated -Wall \ + -Wno-multichar -Wno-comment -Wno-sign-compare -funsigned-char \ + -Wno-reorder -fno-gnu-keywords -ftemplate-depth-25 -pthread \ + -Wno-deprecated -fno-gnu-keywords \ + -g + +LDFLAGS =-Wl,-Bsymbolic -shared + +LIBRARY=dynamica.so + +ifdef DISNEY +#inside Disney +CPPFLAGS += -DINSIDE_DISNEY + +MAYA_PLUG_IN_PATH=/tmp + +BULLET=$(RP_bullet) +BULLET_INCLUDE=-I$(BULLET)/include +BULLET_LIB=-L$(BULLET)/lib \ + -lGIMPACT -lGIMPACTUtils -lbulletdynamics \ + -lbulletmath -lbulletcollision + +GL_INCLUDE=-I$(RP_glut)/include -I$(RP_glew)/include +GL_LIB=-L$(RP_glut)/lib -L$(RP_glew)/lib -lGL -lGLU -lglut -lGLEW +else +#Nicola's + +MAYA_PLUG_IN_PATH=/usr/maya-plugins + +BULLET=/usr/bullet-2.70 +BULLET_INCLUDE=-I$(BULLET)/src -I$(BULLET)/Extras/GIMPACT/include +BULLET_LIB=-L$(BULLET)/out/linux/optimize/libs \ + -lGIMPACT -lGIMPACTUtils -lbulletdynamics \ + -lbulletmath -lbulletcollision -lbulletopenglsupport + +GL_LIB=-lGL -lGLU -lglut -lGLEW +endif + +MAYA=$(MAYA_LOCATION) +MAYA_INCLUDE=-I$(MAYA)/include +MAYA_LIB=-L$(MAYA)/lib -lOpenMaya -lFoundation -lOpenMayaUI -lOpenMayaFX + +SOURCES = pluginMain.cpp rigidBodyNode.cpp rigidBodyArrayNode.cpp collisionShapeNode.cpp \ + solver.cpp bt_solver.cpp dSolverNode.cpp dSolverCmd.cpp dRigidBodyCmd.cpp dRigidBodyArrayCmd.cpp \ + pdbIO.cpp + +HEADERS = box_shape.h bt_sphere_shape.h dSolverNode.h rigid_body_impl.h \ + box_shape_impl.h collision_shape.h mathUtils.h rigidBodyNode.h \ + bt_box_shape.h collision_shape_impl.h mayaUtils.h solver.h \ + bt_collision_shape.h collisionShapeNode.h mesh_shape.h solver_impl.h \ + bt_convex_hull_shape.h convex_hull_shape.h mesh_shape_impl.h sphere_shape.h \ + bt_mesh_shape.h convex_hull_shape_impl.h plane_shape.h sphere_shape_impl.h \ + bt_plane_shape.h dRigidBodyArrayCmd.h plane_shape_impl.h \ + bt_rigid_body.h dRigidBodyCmd.h rigidBodyArrayNode.h \ + bt_solver.h dSolverCmd.h rigid_body.h pdbIO.h \ + shared_ptr.h + + +INCLUDE_FLAGS= $(GL_INCLUDE) $(BULLET_INCLUDE) $(MAYA_INCLUDE) +LIB_FLAGS=$(BULLET_LIB) $(MAYA_LIB) $(GL_LIB) + +OBJECTS=$(SOURCES:.cpp=.o) + +all: $(SOURCES) $(LIBRARY) + +.cpp.o: $(SOURCES) $(HEADERS) + $(CPP) -c $< $(CPPFLAGS) $(INCLUDE_FLAGS) -o $@ + +$(OBJECTS): $(HEADERS) + +$(LIBRARY): $(OBJECTS) + $(CPP) $(OBJECTS) $(LDFLAGS) $(LIB_FLAGS) -o $@ + +install: $(LIBRARY) + cp -f $(LIBRARY) $(MAYA_PLUG_IN_PATH) + cp -f scripts/*.mel $(MAYA_PLUG_IN_PATH) + cp -f icons/*.xpm $(MAYA_PLUG_IN_PATH) + +clean: + rm -f *.o *.so + diff --git a/Extras/MayaPlugin/box_shape.h b/Extras/MayaPlugin/box_shape.h new file mode 100644 index 000000000..d563a84a9 --- /dev/null +++ b/Extras/MayaPlugin/box_shape.h @@ -0,0 +1,44 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//box_shape.h + +#ifndef DYN_BOX_SHAPE_H +#define DYN_BOX_SHAPE_H + +#include "collision_shape.h" +#include "box_shape_impl.h" + +class box_shape_t: public collision_shape_t +{ +public: + //typedefs + typedef shared_ptr pointer; + +protected: + friend class solver_t; + + box_shape_t(collision_shape_impl_t* impl): collision_shape_t(impl) { } + +}; + +#endif diff --git a/Extras/MayaPlugin/box_shape_impl.h b/Extras/MayaPlugin/box_shape_impl.h new file mode 100644 index 000000000..dc82af58c --- /dev/null +++ b/Extras/MayaPlugin/box_shape_impl.h @@ -0,0 +1,39 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//box_shape_impl.h + +#ifndef DYN_BOX_SHAPE_IMPL_H +#define DYN_BOX_SHAPE_IMPL_H + +#include "collision_shape_impl.h" + +class box_shape_impl_t: public collision_shape_impl_t +{ +public: + //typedefs + +private: + +}; + +#endif diff --git a/Extras/MayaPlugin/bt_box_shape.h b/Extras/MayaPlugin/bt_box_shape.h new file mode 100644 index 000000000..661555528 --- /dev/null +++ b/Extras/MayaPlugin/bt_box_shape.h @@ -0,0 +1,94 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//bt_box_shape.h + +#ifndef DYN_BT_BOX_SHAPE_H +#define DYN_BT_BOX_SHAPE_H + +#include "box_shape_impl.h" + +class bt_box_shape_t: public bt_collision_shape_t, public box_shape_impl_t +{ +public: + virtual void gl_draw(size_t draw_style) { + btBoxShape *box_shape = static_cast(shape()); + btVector3 const& e = box_shape->getHalfExtentsWithoutMargin(); + glPushMatrix(); + + glScalef(2 * e.x(), 2 * e.y(), 2 * e.z()); + if(draw_style & collision_shape_t::kDSSolid) { + glutSolidCube(1.0); + } else { + glutWireCube(1.0); + } + glPopMatrix(); + } + + virtual void set_scale(vec3f const& s) { + const btVector3& scale = shape()->getLocalScaling(); + if(scale.x() != s[0] || scale.y() != s[1] || scale.z() != s[2]) { + shape()->setLocalScaling(btVector3(s[0], s[1], s[2])); + update(); + } + } + + virtual void get_scale(vec3f& s) { + const btVector3& scale = shape()->getLocalScaling(); + s = vec3f(scale.x(), scale.y(), scale.z()); + } + + virtual float volume() { return m_volume; } + virtual vec3f const& local_inertia() { return m_local_inertia; } + virtual vec3f const& center() { return m_center; } + virtual quatf const& rotation() { return m_rotation; } + +protected: + friend class bt_solver_t; + + bt_box_shape_t(vec3f const& halfExtents): + bt_collision_shape_t() + { + set_shape(new btBoxShape(btVector3(halfExtents[0], halfExtents[0], halfExtents[0]))); + update(); + } + + void update() + { + btBoxShape *box_shape = static_cast(shape()); + btVector3 e = 2 * box_shape->getHalfExtentsWithoutMargin(); + m_volume = e.x() * e.y() * e.z(); + m_center = vec3f(0, 0, 0); + m_rotation = qidentity(); + m_local_inertia = vec3f((e.y() * e.y() + e.z() * e.z()) / 12.0f, + (e.x() * e.x() + e.z() * e.z()) / 12.0f, + (e.x() * e.x() + e.y() * e.y()) / 12.0f); + } + +private: + float m_volume; + vec3f m_center; + quatf m_rotation; + vec3f m_local_inertia; +}; + +#endif diff --git a/Extras/MayaPlugin/bt_collision_shape.h b/Extras/MayaPlugin/bt_collision_shape.h new file mode 100644 index 000000000..5ea96131e --- /dev/null +++ b/Extras/MayaPlugin/bt_collision_shape.h @@ -0,0 +1,51 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//bt_collision_shape.h + +#ifndef DYN_BT_COLLISION_SHAPE_H +#define DYN_BT_COLLISION_SHAPE_H + +#include "btBulletCollisionCommon.h" +#include "btBulletDynamicsCommon.h" + +class bt_collision_shape_t +{ +public: + +protected: + friend class bt_solver_t; + + bt_collision_shape_t() { } + + btCollisionShape* shape() { return m_shape.get(); } + void set_shape(btCollisionShape *shape) { return m_shape.reset(shape); } + +public: + friend class bt_rigid_body_t; + virtual ~bt_collision_shape_t() { } + +private: + shared_ptr m_shape; +}; + +#endif diff --git a/Extras/MayaPlugin/bt_convex_hull_shape.h b/Extras/MayaPlugin/bt_convex_hull_shape.h new file mode 100644 index 000000000..457a136e3 --- /dev/null +++ b/Extras/MayaPlugin/bt_convex_hull_shape.h @@ -0,0 +1,138 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//bt_convex_hull_shape.h + +#ifndef DYN_BT_CONVEX_HULL_SHAPE_H +#define DYN_BT_CONVEX_HULL_SHAPE_H + +#include + +#include "convex_hull_shape_impl.h" +#include "bt_collision_shape.h" + +class bt_convex_hull_shape_t: public bt_collision_shape_t, public convex_hull_shape_impl_t +{ +public: + virtual void gl_draw(size_t draw_style) { + + if(m_vertices.empty() || m_indices.empty()) return; + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + if(draw_style & collision_shape_t::kDSSolid) { + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + } else { + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + } + glVertexPointer(3, GL_FLOAT, 0, &(m_vertices[0])); + glNormalPointer(GL_FLOAT, 0, &(m_normals[0])); + glDrawElements(GL_TRIANGLES, m_indices.size(), GL_UNSIGNED_INT, &(m_indices[0])); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + } + + virtual void set_scale(vec3f const& s) { + shape()->setLocalScaling(btVector3(s[0], s[1], s[2])); + update(); + } + + virtual void get_scale(vec3f& s) { + const btVector3& scale = shape()->getLocalScaling(); + s = vec3f(scale.x(), scale.y(), scale.z()); + } + + virtual float volume() { return m_volume; } + virtual vec3f const& local_inertia() { return m_local_inertia; } + virtual vec3f const& center() { return m_center; } + virtual quatf const& rotation() { return m_rotation; } + +protected: + friend class bt_solver_t; + + bt_convex_hull_shape_t(vec3f const* vertices, size_t num_vertices, + vec3f const* normals, + unsigned int const *indices, size_t num_indices): + bt_collision_shape_t(), + m_normals(normals, normals + num_vertices), + m_indices(indices, indices + num_indices) + { + m_volume = ::volume(vertices, (int*)indices, num_indices); + m_center = center_of_mass(vertices, (int*)indices, num_indices); + mat3x3f I = inertia(vertices, (int*)indices, num_indices, m_center); + m_rotation = diagonalizer(I); + + mat3x3f Q, Qinv; + q_to_mat(m_rotation, Q); + q_to_mat(qconj(m_rotation), Qinv); + + //D = trans(Q) * I * Q; + m_local_inertia = diag(prod(trans(Q), mat3x3f(prod(I, Q)))); + + m_vertices.resize(num_vertices); + for(size_t i = 0; i < m_vertices.size(); ++i) { + m_vertices[i] = prod(Qinv, vertices[i] - m_center); + } + + set_shape(new btConvexHullShape((float const*)&(m_vertices[0]), num_vertices, sizeof(vec3f))); + } + + void update() + { + btConvexHullShape *cu_shape = static_cast(shape()); + + //apply the scaling + btVector3 const& scale = cu_shape->getLocalScaling(); + btPoint3 const* points = cu_shape->getPoints(); + for(int i = 0; i < cu_shape->getNumPoints(); ++i) { + m_vertices[i] = vec3f(scale.x() * points[i].x(), scale.y() * points[i].y(), scale.z() * points[i].z()); + } + m_volume = ::volume(&(m_vertices[0]), (int*)&(m_indices[0]), m_indices.size()); + mat3x3f I = inertia(&(m_vertices[0]), (int*)&(m_indices[0]), (int)m_indices.size(), vec3f(0, 0, 0)); + //std::cout << I << std::endl; + //m_rotation = diagonalizer(I); + //std::cout << rotation << std::endl; + //the rotation shouldn't change from scaling + + mat3x3f Q, Qinv; + q_to_mat(m_rotation, Q); + q_to_mat(qconj(m_rotation), Qinv); + + //D = Q * I * trans(Q); + m_local_inertia = diag(prod(trans(Q), mat3x3f(prod(I, Q)))); + } + +private: + std::vector m_vertices; + std::vector m_normals; + std::vector m_indices; + + float m_volume; + vec3f m_center; + quatf m_rotation; + vec3f m_local_inertia; + + +}; + +#endif diff --git a/Extras/MayaPlugin/bt_mesh_shape.h b/Extras/MayaPlugin/bt_mesh_shape.h new file mode 100644 index 000000000..32fa7f970 --- /dev/null +++ b/Extras/MayaPlugin/bt_mesh_shape.h @@ -0,0 +1,154 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//bt_mesh_shape.h + +#ifndef DYN_BT_MESH_SHAPE_H +#define DYN_BT_MESH_SHAPE_H + +#include +#include + +#include "mesh_shape_impl.h" +#include "bt_collision_shape.h" + +class bt_mesh_shape_t: public bt_collision_shape_t, public mesh_shape_impl_t +{ +public: + virtual void gl_draw(size_t draw_style) { + + if(m_vertices.empty() || m_indices.empty()) return; + + btVector3 const& scale = shape()->getLocalScaling(); + glPushMatrix(); + //glTranslatef(m_center[0], m_center[1], m_center[2]); + glScalef(scale.x(), scale.y(), scale.z()); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + if(draw_style & collision_shape_t::kDSSolid) { + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + } else { + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + } + glVertexPointer(3, GL_FLOAT, 0, &(m_vertices[0])); + glNormalPointer(GL_FLOAT, 0, &(m_normals[0])); + glDrawElements(GL_TRIANGLES, m_indices.size(), GL_UNSIGNED_INT, &(m_indices[0])); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + glPopMatrix(); + } + + virtual void set_scale(vec3f const& s) { + btGImpactMeshShape *gi_shape = static_cast(shape()); + gi_shape->setLocalScaling(btVector3(s[0], s[1], s[2])); + gi_shape->updateBound(); + update(); + } + + virtual void get_scale(vec3f& s) { + const btVector3& scale = shape()->getLocalScaling(); + s = vec3f(scale.x(), scale.y(), scale.z()); + } + + virtual float volume() { return m_volume; } + virtual vec3f const& local_inertia() { return m_local_inertia; } + virtual vec3f const& center() { return m_center; } + virtual quatf const& rotation() { return m_rotation; } + +protected: + friend class bt_solver_t; + + bt_mesh_shape_t(vec3f const* vertices, size_t num_vertices, + vec3f const* normals, + unsigned int const *indices, size_t num_indices): + bt_collision_shape_t(), + m_normals(normals, normals + num_vertices), + m_indices(indices, indices + num_indices) + { + m_volume = ::volume(vertices, (int*)indices, num_indices); + m_center = center_of_mass(vertices, (int*)indices, num_indices); + mat3x3f I = inertia(vertices, (int*)indices, num_indices, m_center); + m_rotation = diagonalizer(I); + + mat3x3f Q, Qinv; + q_to_mat(m_rotation, Q); + q_to_mat(qconj(m_rotation), Qinv); + + //D = trans(Q) * I * Q; + m_local_inertia = diag(prod(trans(Q), mat3x3f(prod(I, Q)))); + + m_vertices.resize(num_vertices); + for(size_t i = 0; i < m_vertices.size(); ++i) { + m_vertices[i] = prod(Qinv, vertices[i] - m_center); + } + + m_tiva.reset(new btTriangleIndexVertexArray(num_indices / 3, (int*)&(m_indices[0]), 3 * sizeof(unsigned int), + num_vertices, (float*)&(m_vertices[0]), sizeof(vec3f))); + + btGImpactMeshShape* gimpactShape = new btGImpactMeshShape(m_tiva.get()); + gimpactShape->setLocalScaling(btVector3(1.0f,1.0f,1.0f)); + gimpactShape->updateBound(); + set_shape(gimpactShape); + + // gimpactShape->setMargin(0.05); + } + + void update() + { + btGImpactMeshShape *gi_shape = static_cast(shape()); + + //apply the scaling + btVector3 const& scale = gi_shape->getLocalScaling(); + + std::vector vertices(m_vertices.size()); + for(int i = 0; i < vertices.size(); ++i) { + vertices[i] = vec3f(scale.x() * m_vertices[i][0], scale.y() * m_vertices[i][1], scale.z() * m_vertices[i][2]); + } + m_volume = ::volume(&(vertices[0]), (int*)&(m_indices[0]), (int)m_indices.size()); + mat3x3f I = inertia(&(vertices[0]), (int*)&(m_indices[0]), (int)m_indices.size(), vec3f(0, 0, 0)); + // std::cout << I << std::endl; + //m_rotation = diagonalizer(I); + //std::cout << rotation << std::endl; + //the rotation shouldn't change from scaling + + mat3x3f Q, Qinv; + q_to_mat(m_rotation, Q); + q_to_mat(qconj(m_rotation), Qinv); + + //D = Q * I * trans(Q); + m_local_inertia = diag(prod(trans(Q), mat3x3f(prod(I, Q)))); + } + +private: + std::vector m_vertices; + std::vector m_normals; + std::vector m_indices; + shared_ptr m_tiva; + + float m_volume; + vec3f m_center; + quatf m_rotation; + vec3f m_local_inertia; +}; + +#endif diff --git a/Extras/MayaPlugin/bt_plane_shape.h b/Extras/MayaPlugin/bt_plane_shape.h new file mode 100644 index 000000000..d198e21df --- /dev/null +++ b/Extras/MayaPlugin/bt_plane_shape.h @@ -0,0 +1,81 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//bt_plane_shape.h + +#ifndef DYN_BT_PLANE_SHAPE_H +#define DYN_BT_PLANE_SHAPE_H + +#include "plane_shape_impl.h" + +class bt_plane_shape_t: public bt_collision_shape_t, public plane_shape_impl_t +{ +public: + virtual void gl_draw(size_t draw_style) { + // btStaticPlaneShape *plane_shape = static_cast(shape()); + glPushMatrix(); + glScalef(100.0, 0.001, 100.0); + if(draw_style & collision_shape_t::kDSSolid) { + glutSolidCube(1.0); + } else { + glutWireCube(1.0); + } + glPopMatrix(); + } + + virtual void set_scale(vec3f const& s) { + shape()->setLocalScaling(btVector3(s[0], s[1], s[2])); + } + + virtual void get_scale(vec3f& s) { + const btVector3& scale = shape()->getLocalScaling(); + s = vec3f(scale.x(), scale.y(), scale.z()); + } + + virtual float volume() { return m_volume; } + virtual vec3f const& local_inertia() { return m_local_inertia; } + virtual vec3f const& center() { return m_center; } + virtual quatf const& rotation() { return m_rotation; } + +protected: + friend class bt_solver_t; + + bt_plane_shape_t(vec3f const& normal, float d): + bt_collision_shape_t(), + m_volume(0), + m_local_inertia(1, 1, 1), + m_center(0, 0, 0), + m_rotation(qidentity()) + { + set_shape(new btStaticPlaneShape(btVector3(normal[0], normal[1], normal[2]), d)); + // shape()->setMargin(0.1); + } + +private: + float m_volume; + vec3f m_center; + quatf m_rotation; + vec3f m_local_inertia; + +}; + +#endif diff --git a/Extras/MayaPlugin/bt_rigid_body.h b/Extras/MayaPlugin/bt_rigid_body.h new file mode 100644 index 000000000..d58ce5b3c --- /dev/null +++ b/Extras/MayaPlugin/bt_rigid_body.h @@ -0,0 +1,194 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//bt_rigid_body.h + +#ifndef DYN_BT_RIGID_BODY_H +#define DYN_BT_RIGID_BODY_H + +#include "shared_ptr.h" +#include "rigid_body_impl.h" +#include "bt_collision_shape.h" + +class bt_rigid_body_t: public rigid_body_impl_t { +public: + virtual void get_transform(mat4x4f &xform) const + { + float m[16]; + m_body->getWorldTransform().getOpenGLMatrix(m); + xform = trans(cmat(m)); + } + + virtual void get_transform(vec3f &position, quatf &rotation) const + { + const btTransform& btxform = m_body->getWorldTransform(); + btQuaternion q = btxform.getRotation(); + btVector3 p = btxform.getOrigin(); + // position = vec3f(p.x(), p.y(), p.z()) - m_collision_shape->center(); + position = vec3f(p.x(), p.y(), p.z()); + //rotation = qprod(quatf(q.w(), q.x(), q.y(), q.z()), qconj(m_collision_shape->rotation())); + rotation = quatf(q.w(), q.x(), q.y(), q.z()); + } + + virtual void set_transform(vec3f const &position, quatf const &rotation) + { +// vec3f tp = position + m_collision_shape->center(); + vec3f tp = position; + // quatf tr = qprod(rotation, m_collision_shape->rotation()); + quatf tr = rotation; + // std::cout << "----------" << std::endl; + // std::cout << rotation << std::endl; + // std::cout << m_collision_shape->rotation() << std::endl; + btTransform xform(btQuaternion(tr[1], tr[2], tr[3], tr[0]), + btVector3(tp[0], tp[1], tp[2])); + m_body->setWorldTransform(xform); + } + + virtual void set_kinematic(bool kinematic) + { + if(kinematic) { + m_body->setCollisionFlags(m_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + m_body->setActivationState(DISABLE_DEACTIVATION); + m_body->setMassProps(0, btVector3(0.0,0.0,0.0)); + m_body->updateInertiaTensor(); + } else { + m_body->setCollisionFlags(m_body->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); + m_body->setActivationState(ACTIVE_TAG); + m_body->setMassProps(m_mass, m_inertia); + m_body->updateInertiaTensor(); + } + } + + virtual void set_mass(float mass) + { +// std::cout << "bt_rigid_body::set_mass: " << mass << std::endl; + m_mass = mass; + if(m_body->getCollisionFlags() & btCollisionObject::CF_KINEMATIC_OBJECT) { + m_body->setMassProps(0, btVector3(0,0,0)); + } else { + m_body->setMassProps(m_mass, m_inertia); + } + m_body->updateInertiaTensor(); + } + + virtual void set_inertia(vec3f const& I) + { + m_inertia = btVector3(I[0], I[1], I[2]); + if(m_body->getCollisionFlags() & btCollisionObject::CF_KINEMATIC_OBJECT) { + m_body->setMassProps(0, btVector3(0,0,0)); + } else { + m_body->setMassProps(m_mass, m_inertia); + } + m_body->updateInertiaTensor(); + } + + virtual void set_restitution(float r) + { + // std::cout << r << std::endl; + m_body->setRestitution(r); + } + + virtual void set_friction(float f) + { + m_body->setFriction(f); + } + + virtual void set_linear_damping(float d) + { + m_linear_damping = d; + m_body->setDamping(m_linear_damping, m_angular_damping); + } + + virtual void set_angular_damping(float d) + { + m_angular_damping = d; + m_body->setDamping(m_linear_damping, m_angular_damping); + } + + virtual void set_linear_velocity(vec3f const& v) + { + m_body->setLinearVelocity(btVector3(v[0], v[1], v[2])); + } + + virtual void get_linear_velocity(vec3f& v) const + { + const btVector3 &val = m_body->getLinearVelocity(); + v = vec3f(val.x(), val.y(), val.z()); + } + + virtual void set_angular_velocity(vec3f const& v) + { + m_body->setAngularVelocity(btVector3(v[0], v[1], v[2])); + } + + virtual void get_angular_velocity(vec3f& v) const + { + const btVector3 &val = m_body->getAngularVelocity(); + v = vec3f(val.x(), val.y(), val.z()); + } + + virtual void clear_forces() + { + m_body->clearForces(); + } + + virtual void apply_central_force(vec3f const& f) + { + m_body->applyCentralForce(btVector3(f[0], f[1], f[2])); + } + + virtual void apply_torque(vec3f const& t) + { + m_body->applyTorque(btVector3(t[0], t[1], t[2])); + } + + btRigidBody* body() { return m_body.get(); } + +protected: + friend class bt_solver_t; + + bt_rigid_body_t(collision_shape_impl_t* cs): + m_collision_shape(cs), + m_mass(1), + m_inertia(2.0/5.0, 2.0/5.0, 2.0/5.0), + m_linear_damping(0), + m_angular_damping(0) + { + bt_collision_shape_t* bt_shape = dynamic_cast(cs); + btRigidBody::btRigidBodyConstructionInfo rbInfo(m_mass, NULL, bt_shape->shape(), m_inertia); + rbInfo.m_restitution = 0; + rbInfo.m_friction = 0.1; + rbInfo.m_linearDamping = m_linear_damping; + rbInfo.m_angularDamping = m_angular_damping; + m_body.reset(new btRigidBody(rbInfo)); + } + +private: + shared_ptr m_body; + collision_shape_impl_t* m_collision_shape; + float m_mass; + btVector3 m_inertia; + float m_linear_damping; + float m_angular_damping; +}; + +#endif diff --git a/Extras/MayaPlugin/bt_solver.cpp b/Extras/MayaPlugin/bt_solver.cpp new file mode 100644 index 000000000..62698343d --- /dev/null +++ b/Extras/MayaPlugin/bt_solver.cpp @@ -0,0 +1,48 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//bt_solver.cpp + +#include "bt_solver.h" + + +btVector3 worldAabbMin(-10000, -10000, -10000); +btVector3 worldAabbMax(10000, 10000, 10000); +int maxProxies = 32000; + +bt_solver_t::bt_solver_t(): + m_broadphase(new btAxisSweep3(worldAabbMin, worldAabbMax, maxProxies)), + m_solver(new btSequentialImpulseConstraintSolver), + m_collisionConfiguration(new btDefaultCollisionConfiguration), + m_dispatcher(new btCollisionDispatcher(m_collisionConfiguration.get())), + m_dynamicsWorld(new btDiscreteDynamicsWorld(m_dispatcher.get(), + m_broadphase.get(), + m_solver.get(), + m_collisionConfiguration.get())) +{ + //register algorithm for concave meshes + btGImpactCollisionAlgorithm::registerAlgorithm(m_dispatcher.get()); + + m_dynamicsWorld->setGravity(btVector3(0, -9.81, 0)); + + // m_dynamicsWorld->getSolverInfo().m_splitImpulse = true; +} diff --git a/Extras/MayaPlugin/bt_solver.h b/Extras/MayaPlugin/bt_solver.h new file mode 100644 index 000000000..cd58e525d --- /dev/null +++ b/Extras/MayaPlugin/bt_solver.h @@ -0,0 +1,114 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//bt_solver.h + +#ifndef DYN_BT_SOLVER_H +#define DYN_BT_SOLVER_H + +#include "btBulletCollisionCommon.h" +#include "btBulletDynamicsCommon.h" +#include "GIMPACT/Bullet/btGImpactShape.h" +#include "GIMPACT/Bullet/btGImpactCollisionAlgorithm.h" + +#include "solver_impl.h" +#include "bt_rigid_body.h" +#include "bt_sphere_shape.h" +#include "bt_plane_shape.h" +#include "bt_box_shape.h" +#include "bt_convex_hull_shape.h" +#include "bt_mesh_shape.h" + +class bt_solver_t: public solver_impl_t +{ +public: + virtual rigid_body_impl_t* create_rigid_body(collision_shape_impl_t* cs) { + return new bt_rigid_body_t(cs); + } + + virtual collision_shape_impl_t* create_sphere_shape(float radius) { + return new bt_sphere_shape_t(radius); + } + + virtual collision_shape_impl_t* create_plane_shape(vec3f const& normal, float d) { + return new bt_plane_shape_t(normal, d); + } + + virtual collision_shape_impl_t* create_box_shape(vec3f const& halfExtents) { + return new bt_box_shape_t(halfExtents); + } + + virtual collision_shape_impl_t* create_convex_hull_shape(vec3f const* vertices, size_t num_vertices, + vec3f const* normals, + unsigned int const *indices, size_t num_indices) + { + return new bt_convex_hull_shape_t(vertices, num_vertices, normals, indices, num_indices); + } + + virtual collision_shape_impl_t* create_mesh_shape(vec3f const* vertices, size_t num_vertices, + vec3f const* normals, + unsigned int const *indices, size_t num_indices) + { + return new bt_mesh_shape_t(vertices, num_vertices, normals, indices, num_indices); + } + + virtual void add_rigid_body(rigid_body_impl_t* rb) + { + bt_rigid_body_t* bt_body = static_cast(rb); + m_dynamicsWorld->addRigidBody(bt_body->body()); + } + + virtual void remove_rigid_body(rigid_body_impl_t* rb) + { + bt_rigid_body_t* bt_body = static_cast(rb); + m_dynamicsWorld->removeRigidBody(bt_body->body()); + } + + virtual void set_gravity(vec3f const& g) + { + m_dynamicsWorld->setGravity(btVector3(g[0], g[1], g[2])); + } + + virtual void set_split_impulse(bool enabled) + { + m_dynamicsWorld->getSolverInfo().m_splitImpulse = enabled; + } + + virtual void step_simulation(float dt) + { + m_dynamicsWorld->stepSimulation(dt, 1000, 1.0 / 120.0); + } + +protected: + friend class solver_t; + bt_solver_t(); + +private: + + shared_ptr m_broadphase; + shared_ptr m_solver; + shared_ptr m_collisionConfiguration; + shared_ptr m_dispatcher; + shared_ptr m_dynamicsWorld; +}; + +#endif diff --git a/Extras/MayaPlugin/bt_sphere_shape.h b/Extras/MayaPlugin/bt_sphere_shape.h new file mode 100644 index 000000000..632713518 --- /dev/null +++ b/Extras/MayaPlugin/bt_sphere_shape.h @@ -0,0 +1,92 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//bt_sphere_shape.h + +#ifndef DYN_BT_SPHERE_SHAPE_H +#define DYN_BT_SPHERE_SHAPE_H + +#include + +#include "sphere_shape_impl.h" +#include "bt_collision_shape.h" +#include "collision_shape.h" + +class bt_sphere_shape_t: public bt_collision_shape_t, public sphere_shape_impl_t +{ +public: + virtual void gl_draw(size_t draw_style) { + btSphereShape *sphere_shape = static_cast(shape()); + if(draw_style & collision_shape_t::kDSSolid) { + glutSolidSphere(sphere_shape->getRadius(), 10, 10); + } else { + glutWireSphere(sphere_shape->getRadius(), 10, 10); + } + } + + virtual void set_scale(vec3f const& s) { + shape()->setLocalScaling(btVector3(s[0], s[1], s[2])); + update(); + } + + virtual void get_scale(vec3f& s) { + const btVector3& scale = shape()->getLocalScaling(); + s = vec3f(scale.x(), scale.y(), scale.z()); + } + + virtual float volume() { return m_volume; } + virtual vec3f const& local_inertia() { return m_local_inertia; } + virtual vec3f const& center() { return m_center; } + virtual quatf const& rotation() { return m_rotation; } + +protected: + friend class bt_solver_t; + + bt_sphere_shape_t(float radius): + bt_collision_shape_t() + { + set_shape(new btSphereShape(radius)); + // shape()->setMargin(0.1); + update(); + } + + void update() + { + btSphereShape *sphere_shape = static_cast(shape()); + float radius = sphere_shape->getRadius(); + m_volume = (4.0 * 3.1415926 * radius * radius * radius) / 3.0; + m_center = vec3f(0, 0, 0); + m_rotation = qidentity(); + m_local_inertia = vec3f(2.0 / 5.0 * radius * radius, + 2.0 / 5.0 * radius * radius, + 2.0 / 5.0 * radius * radius); + } + +private: + float m_volume; + vec3f m_center; + quatf m_rotation; + vec3f m_local_inertia; + +}; + +#endif diff --git a/Extras/MayaPlugin/collisionShapeNode.cpp b/Extras/MayaPlugin/collisionShapeNode.cpp new file mode 100644 index 000000000..62459d5d0 --- /dev/null +++ b/Extras/MayaPlugin/collisionShapeNode.cpp @@ -0,0 +1,326 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//collisionShapeNode.cpp + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "collisionShapeNode.h" +#include "mayaUtils.h" +#include "solver.h" + +MTypeId collisionShapeNode::typeId( 0x100307 ); +MString collisionShapeNode::typeName( "dCollisionShape" ); + +MObject collisionShapeNode::ia_shape; +MObject collisionShapeNode::ia_type; +MObject collisionShapeNode::ia_scale; +MObject collisionShapeNode::ca_collisionShape; +MObject collisionShapeNode::ca_collisionShapeParam; +MObject collisionShapeNode::oa_collisionShape; + +MStatus collisionShapeNode::initialize() +{ + MStatus status; + MFnMessageAttribute fnMsgAttr; + MFnNumericAttribute fnNumericAttr; + MFnEnumAttribute fnEnumAttr; + + ia_type = fnEnumAttr.create("type", "tp", 5, &status); + MCHECKSTATUS(status, "creating type attribute") + fnEnumAttr.addField("Convex Hull", 0); + fnEnumAttr.addField("Mesh", 1); + fnEnumAttr.addField("Cylinder", 2); + fnEnumAttr.addField("Capsule", 3); + fnEnumAttr.addField("Box", 4); + fnEnumAttr.addField("Sphere", 5); + fnEnumAttr.addField("Plane", 6); + fnEnumAttr.setKeyable(true); + status = addAttribute(ia_type); + MCHECKSTATUS(status, "adding type attribute") + + ia_scale = fnNumericAttr.createPoint("scale", "sc", &status); + MCHECKSTATUS(status, "creating ia_scale attribute") + fnNumericAttr.setDefault(1.0, 1.0, 1.0); + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_scale); + MCHECKSTATUS(status, "adding ia_scale attribute") + + oa_collisionShape = fnMsgAttr.create("outCollisionShape", "oucs", &status); + MCHECKSTATUS(status, "creating outCollisionShape attribute") + status = addAttribute(oa_collisionShape); + MCHECKSTATUS(status, "adding outCollisionShape attribute") + + ia_shape = fnMsgAttr.create("inShape", "insh", &status); + MCHECKSTATUS(status, "creating inShape attribute") + status = addAttribute(ia_shape); + MCHECKSTATUS(status, "adding inShape attribute") + + ca_collisionShape = fnNumericAttr.create("ca_collisionShape", "ccs", MFnNumericData::kBoolean, 0, &status); + MCHECKSTATUS(status, "creating ca_collisionShape attribute") + fnNumericAttr.setConnectable(false); + fnNumericAttr.setHidden(true); + fnNumericAttr.setStorable(false); + fnNumericAttr.setKeyable(false); + status = addAttribute(ca_collisionShape); + MCHECKSTATUS(status, "adding ca_collisionShape attribute") + + ca_collisionShapeParam = fnNumericAttr.create("collisionShapeParam", "cspm", MFnNumericData::kBoolean, 0, &status); + MCHECKSTATUS(status, "creating ca_collisionShapeParam attribute") + fnNumericAttr.setConnectable(false); + fnNumericAttr.setHidden(true); + fnNumericAttr.setStorable(false); + fnNumericAttr.setKeyable(false); + status = addAttribute(ca_collisionShapeParam); + MCHECKSTATUS(status, "adding ca_collisionShapeParam attribute") + + // + status = attributeAffects(ia_shape, oa_collisionShape); + MCHECKSTATUS(status, "adding attributeAffects(ia_shape, oa_collisionShape)") + + status = attributeAffects(ia_type, oa_collisionShape); + MCHECKSTATUS(status, "adding attributeAffects(ia_type, oa_collisionShape)") + + status = attributeAffects(ia_scale, oa_collisionShape); + MCHECKSTATUS(status, "adding attributeAffects(ia_scale, oa_collisionShape)") + + // + status = attributeAffects(ia_shape, ca_collisionShape); + MCHECKSTATUS(status, "adding attributeAffects(ia_shape, ca_collisionShape)") + + status = attributeAffects(ia_type, ca_collisionShape); + MCHECKSTATUS(status, "adding attributeAffects(ia_shape, ca_collisionShape)") + + // + status = attributeAffects(ia_shape, ca_collisionShapeParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_shape, oa_collisionShapeParam)") + + status = attributeAffects(ia_scale, ca_collisionShapeParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_scale, oa_collisionShapeParam)") + + status = attributeAffects(ia_type, ca_collisionShapeParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_type, oa_collisionShapeParam)") + + return MS::kSuccess; +} + +collisionShapeNode::collisionShapeNode() +{ + // std::cout << "collisionShapeNode::collisionShapeNode" << std::endl; +} + +collisionShapeNode::~collisionShapeNode() +{ + // std::cout << "collisionShapeNode::~collisionShapeNode" << std::endl; +} + + +void* collisionShapeNode::creator() +{ + return new collisionShapeNode(); +} + + +bool collisionShapeNode::setInternalValueInContext ( const MPlug & plug, + const MDataHandle & dataHandle, + MDGContext & ctx) +{ + return false; //setInternalValueInContext(plug,dataHandle,ctx); +} + +MStatus collisionShapeNode::compute( const MPlug& plug, MDataBlock& data ) +{ + if(plug == oa_collisionShape) { + computeOutputShape(plug, data); + } else if(plug == ca_collisionShape) { + computeCollisionShape(plug, data); + } else if(plug == ca_collisionShapeParam) { + computeCollisionShapeParam(plug, data); + } else { + return MStatus::kUnknownParameter; + } + return MStatus::kSuccess; +} + +collision_shape_t::pointer collisionShapeNode::collisionShape() +{ + MObject thisObject(thisMObject()); + MObject update; + MPlug(thisObject, oa_collisionShape).getValue(update); + MPlug(thisObject, ca_collisionShapeParam).getValue(update); + return m_collision_shape; +} + +void collisionShapeNode::computeCollisionShape(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "collisionShapeNode::computeCollisionShape" << std::endl; + + MObject thisObject(thisMObject()); + + MPlug plgInShape(thisObject, ia_shape); + + MPlug plgType(thisObject, ia_type); + int type; + plgType.getValue(type); + switch(type) { + case 0: + { + //convex hull + MPlugArray plgaConnectedTo; + plgInShape.connectedTo(plgaConnectedTo, true, true); + if(plgaConnectedTo.length() > 0) { + MObject node = plgaConnectedTo[0].node(); + if(node.hasFn(MFn::kMesh)) { + MDagPath dagPath; + MDagPath::getAPathTo(node, dagPath); + MFnMesh fnMesh(dagPath); + MFloatPointArray mpoints; + MFloatVectorArray mnormals; + MIntArray mtrianglecounts; + MIntArray mtrianglevertices; + fnMesh.getPoints(mpoints, MSpace::kWorld); + fnMesh.getNormals(mnormals, MSpace::kWorld); + fnMesh.getTriangles(mtrianglecounts, mtrianglevertices); + + std::vector vertices(mpoints.length()); + std::vector normals(mpoints.length()); + std::vector indices(mtrianglevertices.length()); + + for(size_t i = 0; i < vertices.size(); ++i) { + vertices[i] = vec3f(mpoints[i].x, mpoints[i].y, mpoints[i].z); + normals[i] = vec3f(mnormals[i].x, mnormals[i].y, mnormals[i].z); + } + for(size_t i = 0; i < indices.size(); ++i) { + indices[i] = mtrianglevertices[i]; + } + m_collision_shape = solver_t::create_convex_hull_shape(&(vertices[0]), vertices.size(), &(normals[0]), + &(indices[0]), indices.size()); + } + } + } + break; + case 1: + //mesh + { + //convex hull + MPlugArray plgaConnectedTo; + plgInShape.connectedTo(plgaConnectedTo, true, true); + if(plgaConnectedTo.length() > 0) { + MObject node = plgaConnectedTo[0].node(); + if(node.hasFn(MFn::kMesh)) { + MDagPath dagPath; + MDagPath::getAPathTo(node, dagPath); + MFnMesh fnMesh(dagPath); + MFloatPointArray mpoints; + MFloatVectorArray mnormals; + MIntArray mtrianglecounts; + MIntArray mtrianglevertices; + fnMesh.getPoints(mpoints, MSpace::kWorld); + fnMesh.getNormals(mnormals, MSpace::kWorld); + fnMesh.getTriangles(mtrianglecounts, mtrianglevertices); + + std::vector vertices(mpoints.length()); + std::vector normals(mpoints.length()); + std::vector indices(mtrianglevertices.length()); + + for(size_t i = 0; i < vertices.size(); ++i) { + vertices[i] = vec3f(mpoints[i].x, mpoints[i].y, mpoints[i].z); + normals[i] = vec3f(mnormals[i].x, mnormals[i].y, mnormals[i].z); + } + for(size_t i = 0; i < indices.size(); ++i) { + indices[i] = mtrianglevertices[i]; + } + m_collision_shape = solver_t::create_mesh_shape(&(vertices[0]), vertices.size(), &(normals[0]), + &(indices[0]), indices.size()); + } + } + } + break; + case 2: + //cylinder + break; + case 3: + //capsule + break; + case 4: + //box + m_collision_shape = solver_t::create_box_shape(); + break; + case 5: + //sphere + m_collision_shape = solver_t::create_sphere_shape(); + break; + case 6: + //plane + m_collision_shape = solver_t::create_plane_shape(); + break; + } + + assert(m_collision_shape); + + data.setClean(plug); +} + + +void collisionShapeNode::computeCollisionShapeParam(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "collisionShapeNode::computeCollisionShapeParam" << std::endl; + + MObject thisObject(thisMObject()); + + MObject update; + MPlug(thisObject, ia_shape).getValue(update); + MPlug(thisObject, ia_type).getValue(update); + + float3& scale = data.inputValue(ia_scale).asFloat3(); + + m_collision_shape->set_scale(vec3f(scale[0], scale[1], scale[2])); + + data.setClean(plug); +} + +void collisionShapeNode::computeOutputShape(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "collisionShapeNode::computeOutputShape" << std::endl; + + MObject thisObject(thisMObject()); + + MObject update; + MPlug(thisObject, ca_collisionShape).getValue(update); + MPlug(thisObject, ca_collisionShapeParam).getValue(update); + + data.setClean(plug); +} diff --git a/Extras/MayaPlugin/collisionShapeNode.h b/Extras/MayaPlugin/collisionShapeNode.h new file mode 100644 index 000000000..eec461e91 --- /dev/null +++ b/Extras/MayaPlugin/collisionShapeNode.h @@ -0,0 +1,80 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//collisionShapeNode.h + +#ifndef DYN_COLLISION_SHAPE_NODE_H +#define DYN_COLLISION_SHAPE_NODE_H + +#include +#include +#include + +#include "collision_shape.h" + + +class collisionShapeNode: public MPxNode +{ +public: + collisionShapeNode(); + virtual ~collisionShapeNode(); + + virtual bool setInternalValueInContext ( const MPlug & plug, + const MDataHandle & dataHandle, + MDGContext & ctx); + + virtual MStatus compute( const MPlug& plug, MDataBlock& data ); + + static void * creator(); + static MStatus initialize(); + +public: + + collision_shape_t::pointer collisionShape(); + +public: + + //Attributes + static MObject ia_shape; + static MObject ia_type; + static MObject ia_scale; + static MObject ca_collisionShape; + static MObject ca_collisionShapeParam; + static MObject oa_collisionShape; + +public: + static MTypeId typeId; + static MString typeName; + +protected: + void computeCollisionShape(const MPlug& plug, MDataBlock& data); + void computeCollisionShapeParam(const MPlug& plug, MDataBlock& data); + void computeOutputShape(const MPlug& plug, MDataBlock& data); + +private: + collision_shape_t::pointer m_collision_shape; + +}; + + + +#endif diff --git a/Extras/MayaPlugin/collision_shape.h b/Extras/MayaPlugin/collision_shape.h new file mode 100644 index 000000000..9fc48b305 --- /dev/null +++ b/Extras/MayaPlugin/collision_shape.h @@ -0,0 +1,68 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//collision_shape.h + +#ifndef DYN_COLLISION_SHAPE_H +#define DYN_COLLISION_SHAPE_H + +#include "shared_ptr.h" +#include "collision_shape_impl.h" + +class collision_shape_t +{ +public: + //typedefs + typedef shared_ptr pointer; + + //enums + enum DrawStyle { + kDSWireframe = 0x0001, + kDSSolid = 0x0002 + }; + + virtual void gl_draw(size_t draw_style = kDSSolid) { m_impl->gl_draw(draw_style); } + + virtual void set_scale(vec3f const& s) { m_impl->set_scale(s); } + virtual void get_scale(vec3f& s) { m_impl->get_scale(s); } + + virtual float volume() { return m_impl->volume(); } + //for the inertia is assumed that the mass is 1.0. just multiply by the mass + virtual vec3f const& local_inertia() { return m_impl->local_inertia(); } + virtual vec3f const& center() { return m_impl->center(); } + virtual quatf const& rotation() { return m_impl->rotation(); } + +public: + virtual ~collision_shape_t() {} + +protected: + friend class solver_t; + + collision_shape_t(collision_shape_impl_t* impl): m_impl(impl) { } + + collision_shape_impl_t* impl() { return m_impl.get(); } + +private: + shared_ptr m_impl; +}; + +#endif diff --git a/Extras/MayaPlugin/collision_shape_impl.h b/Extras/MayaPlugin/collision_shape_impl.h new file mode 100644 index 000000000..4b3889eab --- /dev/null +++ b/Extras/MayaPlugin/collision_shape_impl.h @@ -0,0 +1,49 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//collision_shape_impl.h + +#ifndef DYN_COLLISION_SHAPE_IMPL_H +#define DYN_COLLISION_SHAPE_IMPL_H + +#include "shared_ptr.h" +#include "mathUtils.h" + +class collision_shape_impl_t +{ +public: + // + virtual void gl_draw(size_t draw_style) = 0; + + virtual void set_scale(vec3f const& s) = 0; + virtual void get_scale(vec3f& s) = 0; + + virtual float volume() = 0; + virtual vec3f const& local_inertia() = 0; + virtual vec3f const& center() = 0; + virtual quatf const& rotation() = 0; + +public: + virtual ~collision_shape_impl_t() {}; +}; + +#endif diff --git a/Extras/MayaPlugin/convex_hull_shape.h b/Extras/MayaPlugin/convex_hull_shape.h new file mode 100644 index 000000000..040278a08 --- /dev/null +++ b/Extras/MayaPlugin/convex_hull_shape.h @@ -0,0 +1,44 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//convex_hull_shape.h + +#ifndef DYN_CONVEX_HULL_SHAPE_H +#define DYN_CONVEX_HULL_SHAPE_H + +#include "collision_shape.h" +#include "collision_shape_impl.h" + +class convex_hull_shape_t: public collision_shape_t +{ +public: + //typedefs + typedef shared_ptr pointer; + +protected: + friend class solver_t; + + convex_hull_shape_t(collision_shape_impl_t* impl): collision_shape_t(impl) { } + +}; + +#endif diff --git a/Extras/MayaPlugin/convex_hull_shape_impl.h b/Extras/MayaPlugin/convex_hull_shape_impl.h new file mode 100644 index 000000000..3fa3103a0 --- /dev/null +++ b/Extras/MayaPlugin/convex_hull_shape_impl.h @@ -0,0 +1,39 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//convex_hull_shape_impl.h + +#ifndef DYN_CONVEX_HULL_SHAPE_IMPL_H +#define DYN_CONVEX_HULL_SHAPE_IMPL_H + +#include "collision_shape_impl.h" + +class convex_hull_shape_impl_t: public collision_shape_impl_t +{ +public: + //typedefs + +private: + +}; + +#endif diff --git a/Extras/MayaPlugin/dRigidBodyArrayCmd.cpp b/Extras/MayaPlugin/dRigidBodyArrayCmd.cpp new file mode 100644 index 000000000..299b14bd8 --- /dev/null +++ b/Extras/MayaPlugin/dRigidBodyArrayCmd.cpp @@ -0,0 +1,147 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//dRigidBodyArrayCmd.cpp + +#include +#include +#include + +#include "rigidBodyArrayNode.h" +#include "dRigidBodyArrayCmd.h" + + +MString dRigidBodyArrayCmd::typeName("dRigidBodyArray"); + +dRigidBodyArrayCmd::dRigidBodyArrayCmd() + : m_argDatabase(0), + m_dagModifier(0) +{ +} + + +dRigidBodyArrayCmd::~dRigidBodyArrayCmd() +{ + if (m_argDatabase) { + delete m_argDatabase; + } + + if (m_dagModifier) { + delete m_dagModifier; + } +} + + +void * +dRigidBodyArrayCmd::creator() +{ + return new dRigidBodyArrayCmd; +} + + +MSyntax +dRigidBodyArrayCmd::syntax() +{ + MSyntax syntax; + syntax.enableQuery(false); + syntax.enableEdit(false); + + syntax.addFlag("-n", "-name", MSyntax::kString); + // syntax.addFlag("-fn", "-filename", MSyntax::kString); + // syntax.addFlag("-col", "-color", MSyntax::kString); + // syntax.addFlag("-dia", "-diameter", MSyntax::kDouble); + + return syntax; +} + + +MStatus +dRigidBodyArrayCmd::doIt(const MArgList &args) +{ + MStatus stat; + m_argDatabase = new MArgDatabase(syntax(), args, &stat); + if (stat == MS::kFailure) { + return stat; + } + return redoIt(); +} + + +MStatus +dRigidBodyArrayCmd::undoIt() +{ + MGlobal::setActiveSelectionList(m_undoSelectionList); + + if (m_dagModifier) { + m_dagModifier->undoIt(); + delete m_dagModifier; + m_dagModifier = 0; + } + + return MS::kSuccess; +} + + +MStatus +dRigidBodyArrayCmd::redoIt() +{ + MGlobal::getActiveSelectionList(m_undoSelectionList); + + MString name; + if (m_argDatabase->isFlagSet("-name")) { + m_argDatabase->getFlagArgument("-name", 0, name); + } + if (!name.length()) { + name = "dRigidBodyArray"; + } + + m_dagModifier = new MDagModifier; + + MObject parentObj = m_dagModifier->createNode("transform"); + m_dagModifier->renameNode(parentObj, name + "#"); + m_dagModifier->doIt(); + + MObject dRigidBodyArrayObj = m_dagModifier->createNode(rigidBodyArrayNode::typeId, parentObj); + std::string dRigidBodyArrayName = MFnDependencyNode(parentObj).name().asChar(); + std::string::size_type pos = dRigidBodyArrayName.find_last_not_of("0123456789"); + dRigidBodyArrayName.insert(pos + 1, "Shape"); + m_dagModifier->renameNode(dRigidBodyArrayObj, dRigidBodyArrayName.c_str()); + m_dagModifier->doIt(); + + // connect the solver attribute + MPlug plgSolver(dRigidBodyArrayObj, rigidBodyArrayNode::ia_solver); + MSelectionList slist; + slist.add("dSolver1"); + MObject solverObj; + if(slist.length() != 0) { + slist.getDependNode(0, solverObj); + MPlug plgRigidBodies = MFnDependencyNode(solverObj).findPlug("rigidBodies", false); + m_dagModifier->connect(plgRigidBodies, plgSolver); + m_dagModifier->doIt(); + } + + MGlobal::select(parentObj, MGlobal::kReplaceList); + + setResult(MFnDependencyNode(dRigidBodyArrayObj).name()); + + return MS::kSuccess; +} diff --git a/Extras/MayaPlugin/dRigidBodyArrayCmd.h b/Extras/MayaPlugin/dRigidBodyArrayCmd.h new file mode 100644 index 000000000..b6d360821 --- /dev/null +++ b/Extras/MayaPlugin/dRigidBodyArrayCmd.h @@ -0,0 +1,58 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//dRigidBodyArrayCmd.h + +#ifndef DYN_DRIGIDBODYARRAYCMD_H +#define DYN_DRIGIDBODYARRAYCMD_H + +#include +#include +#include + +#include + +class dRigidBodyArrayCmd : public MPxCommand +{ +public: + dRigidBodyArrayCmd(); + virtual ~dRigidBodyArrayCmd(); + + static void *creator(); + static MSyntax syntax(); + + MStatus doIt(const MArgList &i_mArgList); + MStatus redoIt(); + MStatus undoIt(); + bool isUndoable() const { return true; } + bool hasSyntax() const { return true; } + + static MString typeName; + +protected: + MArgDatabase *m_argDatabase; + MDagModifier *m_dagModifier; + + MSelectionList m_undoSelectionList; +}; + +#endif diff --git a/Extras/MayaPlugin/dRigidBodyCmd.cpp b/Extras/MayaPlugin/dRigidBodyCmd.cpp new file mode 100644 index 000000000..8f9fd24b2 --- /dev/null +++ b/Extras/MayaPlugin/dRigidBodyCmd.cpp @@ -0,0 +1,147 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//dRidigBodyCmd.cpp + +#include +#include +#include + +#include "rigidBodyNode.h" +#include "dRigidBodyCmd.h" + + +MString dRigidBodyCmd::typeName("dRigidBody"); + +dRigidBodyCmd::dRigidBodyCmd() + : m_argDatabase(0), + m_dagModifier(0) +{ +} + + +dRigidBodyCmd::~dRigidBodyCmd() +{ + if (m_argDatabase) { + delete m_argDatabase; + } + + if (m_dagModifier) { + delete m_dagModifier; + } +} + + +void * +dRigidBodyCmd::creator() +{ + return new dRigidBodyCmd; +} + + +MSyntax +dRigidBodyCmd::syntax() +{ + MSyntax syntax; + syntax.enableQuery(false); + syntax.enableEdit(false); + + syntax.addFlag("-n", "-name", MSyntax::kString); + // syntax.addFlag("-fn", "-filename", MSyntax::kString); + // syntax.addFlag("-col", "-color", MSyntax::kString); + // syntax.addFlag("-dia", "-diameter", MSyntax::kDouble); + + return syntax; +} + + +MStatus +dRigidBodyCmd::doIt(const MArgList &args) +{ + MStatus stat; + m_argDatabase = new MArgDatabase(syntax(), args, &stat); + if (stat == MS::kFailure) { + return stat; + } + return redoIt(); +} + + +MStatus +dRigidBodyCmd::undoIt() +{ + MGlobal::setActiveSelectionList(m_undoSelectionList); + + if (m_dagModifier) { + m_dagModifier->undoIt(); + delete m_dagModifier; + m_dagModifier = 0; + } + + return MS::kSuccess; +} + + +MStatus +dRigidBodyCmd::redoIt() +{ + MGlobal::getActiveSelectionList(m_undoSelectionList); + + MString name; + if (m_argDatabase->isFlagSet("-name")) { + m_argDatabase->getFlagArgument("-name", 0, name); + } + if (!name.length()) { + name = "dRigidBody"; + } + + m_dagModifier = new MDagModifier; + + MObject parentObj = m_dagModifier->createNode("transform"); + m_dagModifier->renameNode(parentObj, name + "#"); + m_dagModifier->doIt(); + + MObject dRigidBodyObj = m_dagModifier->createNode(rigidBodyNode::typeId, parentObj); + std::string dRigidBodyName = MFnDependencyNode(parentObj).name().asChar(); + std::string::size_type pos = dRigidBodyName.find_last_not_of("0123456789"); + dRigidBodyName.insert(pos + 1, "Shape"); + m_dagModifier->renameNode(dRigidBodyObj, dRigidBodyName.c_str()); + m_dagModifier->doIt(); + + // connect the solver attribute + MPlug plgSolver(dRigidBodyObj, rigidBodyNode::ia_solver); + MSelectionList slist; + slist.add("dSolver1"); + MObject solverObj; + if(slist.length() != 0) { + slist.getDependNode(0, solverObj); + MPlug plgRigidBodies = MFnDependencyNode(solverObj).findPlug("rigidBodies", false); + m_dagModifier->connect(plgRigidBodies, plgSolver); + m_dagModifier->doIt(); + } + + MGlobal::select(parentObj, MGlobal::kReplaceList); + + setResult(MFnDependencyNode(dRigidBodyObj).name()); + + return MS::kSuccess; +} diff --git a/Extras/MayaPlugin/dRigidBodyCmd.h b/Extras/MayaPlugin/dRigidBodyCmd.h new file mode 100644 index 000000000..6604d5e05 --- /dev/null +++ b/Extras/MayaPlugin/dRigidBodyCmd.h @@ -0,0 +1,58 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//dRigidBodyCmd.h + +#ifndef DYN_DRIGIDBODYCMD_H +#define DYN_DRIGIDBODYCMD_H + +#include +#include +#include + +#include + +class dRigidBodyCmd : public MPxCommand +{ +public: + dRigidBodyCmd(); + virtual ~dRigidBodyCmd(); + + static void *creator(); + static MSyntax syntax(); + + MStatus doIt(const MArgList &i_mArgList); + MStatus redoIt(); + MStatus undoIt(); + bool isUndoable() const { return true; } + bool hasSyntax() const { return true; } + + static MString typeName; + +protected: + MArgDatabase *m_argDatabase; + MDagModifier *m_dagModifier; + + MSelectionList m_undoSelectionList; +}; + +#endif diff --git a/Extras/MayaPlugin/dSolverCmd.cpp b/Extras/MayaPlugin/dSolverCmd.cpp new file mode 100644 index 000000000..b5e9a5cff --- /dev/null +++ b/Extras/MayaPlugin/dSolverCmd.cpp @@ -0,0 +1,126 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//dSolverCmd.cpp + +#include +#include + +#include "dSolverNode.h" +#include "dSolverCmd.h" + +MString dSolverCmd::typeName("dSolver"); + +dSolverCmd::dSolverCmd() + : m_argDatabase(0), + m_dgModifier(0) +{ +} + + +dSolverCmd::~dSolverCmd() +{ + if (m_argDatabase) { + delete m_argDatabase; + } + + if (m_dgModifier) { + delete m_dgModifier; + } +} + + +void * +dSolverCmd::creator() +{ + return new dSolverCmd; +} + + +MSyntax +dSolverCmd::syntax() +{ + MSyntax syntax; + syntax.enableQuery(false); + syntax.enableEdit(false); + + return syntax; +} + + +MStatus +dSolverCmd::doIt(const MArgList &args) +{ + MStatus stat; + m_argDatabase = new MArgDatabase(syntax(), args, &stat); + if (stat == MS::kFailure) { + return stat; + } + return redoIt(); +} + + +MStatus +dSolverCmd::undoIt() +{ + if (m_dgModifier) { + m_dgModifier->undoIt(); + delete m_dgModifier; + m_dgModifier = 0; + } + + return MS::kSuccess; +} + + +MStatus +dSolverCmd::redoIt() +{ + MStatus stat; + + // see if node exists + MItDependencyNodes depIt(MFn::kPluginDependNode); + for (; !depIt.isDone(); depIt.next()) { + MObject obj = depIt.thisNode(); + if (MFnDependencyNode(obj).typeId() == dSolverNode::typeId) { + return stat; + } + } + + m_dgModifier = new MDGModifier; + + MObject dSolverObj = m_dgModifier->createNode(dSolverNode::typeId); + m_dgModifier->doIt(); + + // connect the time attribute + MPlug plgInTime(dSolverObj, dSolverNode::ia_time); + MItDependencyNodes depNodeIt(MFn::kTime); + MObject timeObj = depNodeIt.thisNode(); + if (timeObj != MObject::kNullObj) { + MPlug plgOutTime = MFnDependencyNode(timeObj).findPlug("outTime", false); + m_dgModifier->connect(plgOutTime, plgInTime); + m_dgModifier->doIt(); + } + setResult(MFnDependencyNode(dSolverObj).name()); + + return stat; +} diff --git a/Extras/MayaPlugin/dSolverCmd.h b/Extras/MayaPlugin/dSolverCmd.h new file mode 100644 index 000000000..92e1dc6fc --- /dev/null +++ b/Extras/MayaPlugin/dSolverCmd.h @@ -0,0 +1,56 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//dSolverCmd.h + +#ifndef DYN_DSOLVERCMD_H +#define DYN_DSOLVERCMD_H + +#include +#include + +#include + + +class dSolverCmd : public MPxCommand +{ +public: + dSolverCmd(); + virtual ~dSolverCmd(); + + static void *creator(); + static MSyntax syntax(); + + MStatus doIt(const MArgList &i_mArgList); + MStatus redoIt(); + MStatus undoIt(); + bool isUndoable() const { return true; } + bool hasSyntax() const { return true; } + + static MString typeName; + +protected: + MArgDatabase *m_argDatabase; + MDGModifier *m_dgModifier; +}; + +#endif diff --git a/Extras/MayaPlugin/dSolverNode.cpp b/Extras/MayaPlugin/dSolverNode.cpp new file mode 100644 index 000000000..2655d644d --- /dev/null +++ b/Extras/MayaPlugin/dSolverNode.cpp @@ -0,0 +1,771 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//dSolverNode.cpp + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "mayaUtils.h" +#include "dSolverNode.h" +#include "solver.h" +#include "rigidBodyNode.h" +#include "rigidBodyArrayNode.h" +#include "pdbIO.h" + +MTypeId dSolverNode::typeId( 0x104203 ); +MString dSolverNode::typeName( "dSolver" ); + +MObject dSolverNode::ia_time; +MObject dSolverNode::ia_startTime; +MObject dSolverNode::ia_gravity; +MObject dSolverNode::ia_enabled; +MObject dSolverNode::ia_splitImpulse; +MObject dSolverNode::ia_substeps; +MObject dSolverNode::oa_rigidBodies; +MObject dSolverNode::ssSolverType; + +#define ATTR_POSITION "position" +//#define ATTR_POSITION_TYPE VECTOR_ATTR +#define ATTR_VELOCITY "velocity" +//#define ATTR_VELOCITY_TYPE VECTOR_ATTR + +#define ATTR_IN_RAXIS "in_rotvec" /* vector */ +//#define ATTR_IN_RAXIS_TYPE VECTOR_ATTR +#define ATTR_IN_RANGLE "in_rotang" /* float */ +//#define ATTR_IN_RANGLE_TYPE FLOAT_ATTR +#define ATTR_IN_ROTVEL "in_rotvel" /* float */ +//#define ATTR_IN_ROTVEL_TYPE FLOAT_ATTR +#define ATTR_IN_RAXISNEXT "in_rotvec_next" /* vector */ +//#define ATTR_IN_RAXISNEXT_TYPE VECTOR_ATTR +#define ATTR_IN_RANGLENEXT "in_rotang_next" /* float */ +//#define ATTR_IN_RANGLENEXT_TYPE FLOAT_ATTR + + + +MStatus dSolverNode::initialize() +{ + MStatus status; + MFnEnumAttribute fnEnumAttr; + MFnMessageAttribute fnMsgAttr; + MFnUnitAttribute fnUnitAttr; + MFnNumericAttribute fnNumericAttr; + + // + ssSolverType = fnEnumAttr.create( "ssSolverType", "ssst", 0, &status ); + MCHECKSTATUS(status, "creating ssSolverType attribute") + fnEnumAttr.addField( "Bullet Physics", 0 ); + fnEnumAttr.addField( "Ageia PhysX", 1 ); + fnEnumAttr.addField( "Stanford PhysBAM", 2 ); + status = addAttribute(ssSolverType); + MCHECKSTATUS(status, "adding ssSolverType attribute") + + // + ia_time = fnUnitAttr.create( "inTime", "it", MFnUnitAttribute::kTime, 0.0, &status ); + MCHECKSTATUS(status, "creating ia_time attribute") + fnUnitAttr.setHidden(true); + status = addAttribute(ia_time); + MCHECKSTATUS(status, "adding ia_time attribute") + + ia_startTime = fnUnitAttr.create( "startTime", "stm", MFnUnitAttribute::kTime, 1.0, &status ); + MCHECKSTATUS(status, "creating ia_startTime attribute") + status = addAttribute(ia_startTime); + MCHECKSTATUS(status, "adding ia_startTime attribute") + + oa_rigidBodies = fnMsgAttr.create("rigidBodies", "rbds", &status); + MCHECKSTATUS(status, "creating oa_rigidBodies attribute") + status = addAttribute(oa_rigidBodies); + MCHECKSTATUS(status, "adding oa_rigidBodies attribute") + + ia_gravity = fnNumericAttr.createPoint("gravity", "grvt", &status); + MCHECKSTATUS(status, "creating gravity attribute") + fnNumericAttr.setDefault(0.0, -9.81, 0.0); + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_gravity); + MCHECKSTATUS(status, "adding ia_gravity attribute") + + ia_substeps = fnNumericAttr.create("substeps", "sbs", MFnNumericData::kInt, 1, &status); + MCHECKSTATUS(status, "creating substeps attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_substeps); + MCHECKSTATUS(status, "adding ia_substeps attribute") + + ia_enabled = fnNumericAttr.create("enabled", "enbl", MFnNumericData::kBoolean, true, &status); + MCHECKSTATUS(status, "creating enabled attribute") + status = addAttribute(ia_enabled); + MCHECKSTATUS(status, "adding ia_enabled attribute") + + ia_splitImpulse = fnNumericAttr.create("splitImpulse", "spli", MFnNumericData::kBoolean, false, &status); + MCHECKSTATUS(status, "creating splitImpulse attribute") + status = addAttribute(ia_splitImpulse); + MCHECKSTATUS(status, "adding ia_splitImpulse attribute") + + status = attributeAffects(ia_time, oa_rigidBodies); + MCHECKSTATUS(status, "adding attributeAffects(ia_time, oa_rigidBodies)") + + status = attributeAffects(ia_enabled, oa_rigidBodies); + MCHECKSTATUS(status, "adding attributeAffects(ia_enabled, oa_rigidBodies)") + + return MS::kSuccess; +} + +dSolverNode::dSolverNode() +{ +} + +dSolverNode::~dSolverNode() +{ +} + +void dSolverNode::postConstructor() +{ + //prevent deletion if all the rigidbodies are deleted + setExistWithoutOutConnections(true); +} + +void* dSolverNode::creator() +{ + return new dSolverNode(); +} + +bool dSolverNode::setInternalValueInContext( const MPlug & plug, const MDataHandle & dataHandle, MDGContext & ctx ) +{ + return false; +} + +MStatus dSolverNode::compute(const MPlug& plug, MDataBlock& data) +{ + if(plug == oa_rigidBodies) { + computeRigidBodies(plug, data); + } else { + return MStatus::kUnknownParameter; + } + return MStatus::kSuccess; +} + +void initRigidBody(MObject &node) +{ + MFnDagNode fnDagNode(node); + + rigidBodyNode *rbNode = static_cast(fnDagNode.userNode()); + rigid_body_t::pointer rb = rbNode->rigid_body(); + + if(fnDagNode.parentCount() == 0) { + std::cout << "No transform found!" << std::endl; + return; + } + + MFnTransform fnTransform(fnDagNode.parent(0)); + + MPlug plgActive(node, rigidBodyNode::ia_active); + bool active = false; + plgActive.getValue(active); + if(active) { + //active rigid body, set the world transform from the initial* attributes + MObject obj; + + vec3f pos; + MPlug plgInitialValue(node, rigidBodyNode::ia_initialPosition); + plgInitialValue.child(0).getValue(pos[0]); + plgInitialValue.child(1).getValue(pos[1]); + plgInitialValue.child(2).getValue(pos[2]); + + vec3f rot; + plgInitialValue.setAttribute(rigidBodyNode::ia_initialRotation); + plgInitialValue.child(0).getValue(rot[0]); + plgInitialValue.child(1).getValue(rot[1]); + plgInitialValue.child(2).getValue(rot[2]); + + vec3f vel; + plgInitialValue.setAttribute(rigidBodyNode::ia_initialVelocity); + plgInitialValue.child(0).getValue(vel[0]); + plgInitialValue.child(1).getValue(vel[1]); + plgInitialValue.child(2).getValue(vel[2]); + + vec3f spin; + plgInitialValue.setAttribute(rigidBodyNode::ia_initialSpin); + plgInitialValue.child(0).getValue(spin[0]); + plgInitialValue.child(1).getValue(spin[1]); + plgInitialValue.child(2).getValue(spin[2]); + + MEulerRotation meuler(deg2rad(rot[0]), deg2rad(rot[1]), deg2rad(rot[2])); + MQuaternion mquat = meuler.asQuaternion(); + rb->set_transform(pos, quatf(mquat.w, mquat.x, mquat.y, mquat.z)); + rb->set_linear_velocity(vel); + rb->set_angular_velocity(spin); + rb->set_kinematic(false); + + fnTransform.setRotation(meuler); + fnTransform.setTranslation(MVector(pos[0], pos[1], pos[2]), MSpace::kTransform); + } else { + //passive rigid body, get the world trasform from from the shape node + MQuaternion mquat; + fnTransform.getRotation(mquat); + MVector mpos(fnTransform.getTranslation(MSpace::kTransform)); + rb->set_transform(vec3f(mpos.x, mpos.y, mpos.z), quatf(mquat.w, mquat.x, mquat.y, mquat.z)); + rb->set_kinematic(true); + } +} + +void initRigidBodyArray(MObject &node) +{ + MFnDagNode fnDagNode(node); + + rigidBodyArrayNode *rbNode = static_cast(fnDagNode.userNode()); + std::vector& rbs = rbNode->rigid_bodies(); + + if(fnDagNode.parentCount() == 0) { + std::cout << "No transform found!" << std::endl; + return; + } + + MFnTransform fnTransform(fnDagNode.parent(0)); + + MPlug plgActive(node, rigidBodyArrayNode::ia_active); + bool active = false; + plgActive.getValue(active); + if(active) { + //active rigid body, set the world transform from the initial* attributes + MObject obj; + + MPlug plgInitialPosition(node, rigidBodyArrayNode::ia_initialPosition); + MPlug plgInitialRotation(node, rigidBodyArrayNode::ia_initialRotation); + MPlug plgInitialVelocity(node, rigidBodyArrayNode::ia_initialVelocity); + MPlug plgInitialSpin(node, rigidBodyArrayNode::ia_initialSpin); + + MPlug plgElement; + for(size_t j = 0; j < rbs.size(); ++j) { + vec3f pos; + plgElement = plgInitialPosition.elementByLogicalIndex(j); + plgElement.child(0).getValue(pos[0]); + plgElement.child(1).getValue(pos[1]); + plgElement.child(2).getValue(pos[2]); + + vec3f rot; + plgElement = plgInitialRotation.elementByLogicalIndex(j); + plgElement.child(0).getValue(rot[0]); + plgElement.child(1).getValue(rot[1]); + plgElement.child(2).getValue(rot[2]); + + vec3f vel; + plgElement = plgInitialVelocity.elementByLogicalIndex(j); + plgElement.child(0).getValue(vel[0]); + plgElement.child(1).getValue(vel[1]); + plgElement.child(2).getValue(vel[2]); + + vec3f spin; + plgElement = plgInitialSpin.elementByLogicalIndex(j); + plgElement.child(0).getValue(spin[0]); + plgElement.child(1).getValue(spin[1]); + plgElement.child(2).getValue(spin[2]); + + MEulerRotation meuler(deg2rad(rot[0]), deg2rad(rot[1]), deg2rad(rot[2])); + MQuaternion mquat = meuler.asQuaternion(); + rbs[j]->set_transform(pos, quatf(mquat.w, mquat.x, mquat.y, mquat.z)); + rbs[j]->set_linear_velocity(vel); + rbs[j]->set_angular_velocity(spin); + rbs[j]->set_kinematic(false); + } + + } else { + //passive rigid body, get the world trasform from from the position/rotation attributes + MPlug plgPosition(node, rigidBodyArrayNode::io_position); + MPlug plgRotation(node, rigidBodyArrayNode::io_rotation); + + MPlug plgElement; + for(size_t j = 0; j < rbs.size(); ++j) { + vec3f pos; + plgElement = plgPosition.elementByLogicalIndex(j); + plgElement.child(0).getValue(pos[0]); + plgElement.child(1).getValue(pos[1]); + plgElement.child(2).getValue(pos[2]); + + vec3f rot; + plgElement = plgRotation.elementByLogicalIndex(j); + plgElement.child(0).getValue(rot[0]); + plgElement.child(1).getValue(rot[1]); + plgElement.child(2).getValue(rot[2]); + + MEulerRotation meuler(deg2rad(rot[0]), deg2rad(rot[1]), deg2rad(rot[2])); + MQuaternion mquat = meuler.asQuaternion(); + rbs[j]->set_transform(pos, quatf(mquat.w, mquat.x, mquat.y, mquat.z)); + rbs[j]->set_kinematic(false); + } + } +} + +//init the rigid bodies to it's first frame configuration +void dSolverNode::initRigidBodies(MPlugArray &rbConnections) +{ + for(size_t i = 0; i < rbConnections.length(); ++i) { + MObject node = rbConnections[i].node(); + MFnDependencyNode fnNode(node); + + if(fnNode.typeId() == rigidBodyNode::typeId) { + initRigidBody(node); + } else if(fnNode.typeId() == rigidBodyArrayNode::typeId) { + initRigidBodyArray(node); + } + } +} + +//gather previous and current frame transformations for substep interpolation +void dSolverNode::gatherPassiveTransforms(MPlugArray &rbConnections, std::vector &xforms) +{ + xforms.resize(0); + xforms_t xform; + + + for(size_t i = 0; i < rbConnections.length(); ++i) { + MObject node = rbConnections[i].node(); + MFnDagNode fnDagNode(node); + if(fnDagNode.typeId() == rigidBodyNode::typeId) { + rigidBodyNode *rbNode = static_cast(fnDagNode.userNode()); + rigid_body_t::pointer rb = rbNode->rigid_body(); + + if(fnDagNode.parentCount() == 0) { + std::cout << "No transform found!" << std::endl; + continue; + } + + MFnTransform fnTransform(fnDagNode.parent(0)); + + MPlug plgActive(node, rigidBodyNode::ia_active); + bool active = false; + plgActive.getValue(active); + if(!active) { + MQuaternion mquat; + fnTransform.getRotation(mquat); + MVector mpos(fnTransform.getTranslation(MSpace::kTransform)); + rb->get_transform(xform.m_x0, xform.m_q0); + + xform.m_x1 = vec3f(mpos.x, mpos.y, mpos.z); + xform.m_q1 = quatf(mquat.w, mquat.x, mquat.y, mquat.z); + xforms.push_back(xform); + } + } else if(fnDagNode.typeId() == rigidBodyArrayNode::typeId) { + rigidBodyArrayNode *rbNode = static_cast(fnDagNode.userNode()); + std::vector& rbs = rbNode->rigid_bodies(); + + if(fnDagNode.parentCount() == 0) { + std::cout << "No transform found!" << std::endl; + return; + } + + MPlug plgActive(node, rigidBodyArrayNode::ia_active); + bool active = false; + plgActive.getValue(active); + if(!active) { + MPlug plgPosition(node, rigidBodyArrayNode::io_position); + MPlug plgRotation(node, rigidBodyArrayNode::io_rotation); + + MPlug plgElement; + for(size_t j = 0; j < rbs.size(); ++j) { + rbs[j]->get_transform(xform.m_x0, xform.m_q0); + + plgElement = plgPosition.elementByLogicalIndex(j); + plgElement.child(0).getValue(xform.m_x1[0]); + plgElement.child(1).getValue(xform.m_x1[1]); + plgElement.child(2).getValue(xform.m_x1[2]); + + vec3f rot; + plgElement = plgRotation.elementByLogicalIndex(j); + plgElement.child(0).getValue(rot[0]); + plgElement.child(1).getValue(rot[1]); + plgElement.child(2).getValue(rot[2]); + + MEulerRotation meuler(deg2rad(rot[0]), deg2rad(rot[1]), deg2rad(rot[2])); + MQuaternion mquat = meuler.asQuaternion(); + xform.m_q1 = quatf(mquat.w, mquat.x, mquat.y, mquat.z); + xforms.push_back(xform); + } + } + } + } +} + + +//update the passive rigid bodies by interpolation of the previous and current frame +void dSolverNode::updatePassiveRigidBodies(MPlugArray &rbConnections, std::vector &xforms, float t) +{ + size_t pb = 0; + for(size_t i = 0; i < rbConnections.length(); ++i) { + MObject node = rbConnections[i].node(); + MFnDagNode fnDagNode(node); + if(fnDagNode.typeId() == rigidBodyNode::typeId) { + rigidBodyNode *rbNode = static_cast(fnDagNode.userNode()); + rigid_body_t::pointer rb = rbNode->rigid_body(); + + if(fnDagNode.parentCount() == 0) { + std::cout << "No transform found!" << std::endl; + continue; + } + + MPlug plgActive(node, rigidBodyNode::ia_active); + bool active = false; + plgActive.getValue(active); + if(!active) { + //do linear interpolation for now + rb->set_transform(xforms[pb].m_x0 + t * (xforms[pb].m_x1 - xforms[pb].m_x0), + normalize(xforms[pb].m_q0 + t * (xforms[pb].m_q1 - xforms[pb].m_q0))); + ++pb; + } + } else if(fnDagNode.typeId() == rigidBodyArrayNode::typeId) { + rigidBodyArrayNode *rbNode = static_cast(fnDagNode.userNode()); + std::vector& rbs = rbNode->rigid_bodies(); + + if(fnDagNode.parentCount() == 0) { + std::cout << "No transform found!" << std::endl; + return; + } + + MPlug plgActive(node, rigidBodyArrayNode::ia_active); + bool active = false; + plgActive.getValue(active); + if(!active) { + for(size_t j = 0; j < rbs.size(); ++j) { + rbs[j]->set_transform(xforms[pb].m_x0 + t * (xforms[pb].m_x1 - xforms[pb].m_x0), + normalize(xforms[pb].m_q0 + t * (xforms[pb].m_q1 - xforms[pb].m_q0))); + ++pb; + } + } + } + } +} + +//update the scene after a simulation step +void dSolverNode::updateActiveRigidBodies(MPlugArray &rbConnections) +{ + //update the active rigid bodies to the new configuration + for(size_t i = 0; i < rbConnections.length(); ++i) { + MObject node = rbConnections[i].node(); + MFnDagNode fnDagNode(node); + if(fnDagNode.typeId() == rigidBodyNode::typeId) { + rigidBodyNode *rbNode = static_cast(fnDagNode.userNode()); + rigid_body_t::pointer rb = rbNode->rigid_body(); + + if(fnDagNode.parentCount() == 0) { + std::cout << "No transform found!" << std::endl; + continue; + } + + MFnTransform fnTransform(fnDagNode.parent(0)); + + MPlug plgActive(node, rigidBodyNode::ia_active); + bool active = false; + plgActive.getValue(active); + if(active) { + quatf rot; + vec3f pos; + rb->get_transform(pos, rot); + fnTransform.setRotation(MQuaternion(rot[1], rot[2], rot[3], rot[0])); + fnTransform.setTranslation(MVector(pos[0], pos[1], pos[2]), MSpace::kTransform); + } + } else if(fnDagNode.typeId() == rigidBodyArrayNode::typeId) { + //check if we have to output the rigid bodies to a file + MPlug plgFileIO(node, rigidBodyArrayNode::ia_fileIO); + bool doIO; + plgFileIO.getValue(doIO); + if(doIO) { + dumpRigidBodyArray(node); + } + } + } +} + +//apply fields in the scene from the rigid body +void dSolverNode::applyFields(MPlugArray &rbConnections, float dt) +{ + MVectorArray position; + MVectorArray velocity; + MDoubleArray mass; + + std::vector rigid_bodies; + //gather active rigid bodies + for(size_t i = 0; i < rbConnections.length(); ++i) { + MObject node = rbConnections[i].node(); + MFnDagNode fnDagNode(node); + if(fnDagNode.typeId() == rigidBodyNode::typeId) { + rigidBodyNode *rbNode = static_cast(fnDagNode.userNode()); + rigid_body_t::pointer rb = rbNode->rigid_body(); + + MPlug plgActive(node, rigidBodyNode::ia_active); + bool active = false; + plgActive.getValue(active); + if(active) { + rigid_bodies.push_back(rb.get()); + } + } else if(fnDagNode.typeId() == rigidBodyArrayNode::typeId) { + rigidBodyArrayNode *rbNode = static_cast(fnDagNode.userNode()); + std::vector& rbs = rbNode->rigid_bodies(); + + MPlug plgActive(node, rigidBodyArrayNode::ia_active); + bool active = false; + plgActive.getValue(active); + if(active) { + for(size_t j = 0; j < rbs.size(); ++j) { + rigid_bodies.push_back(rbs[j].get()); + } + } + } + } + + //clear forces and get the properties needed for field computation + for(size_t i = 0; i < rigid_bodies.size(); ++i) { + rigid_bodies[i]->clear_forces(); + vec3f pos, vel; + quatf rot; + rigid_bodies[i]->get_transform(pos, rot); + rigid_bodies[i]->get_linear_velocity(vel); + position.append(MVector(pos[0], pos[1], pos[2])); + velocity.append(MVector(vel[0], vel[1], vel[2])); + //TODO + mass.append(1.0); + // + } + + //apply the fields to the rigid bodies + MVectorArray force; + for(MItDag it(MItDag::kDepthFirst, MFn::kField); !it.isDone(); it.next()) { + MFnField fnField(it.item()); + fnField.getForceAtPoint(position, velocity, mass, force, dt); + for(size_t i = 0; i < rigid_bodies.size(); ++i) { + rigid_bodies[i]->apply_central_force(vec3f(force[i].x, force[i].y, force[i].z)); + } + } +} + +void dSolverNode::computeRigidBodies(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "dSolverNode::computeRigidBodies" << std::endl; + + bool enabled = data.inputValue(ia_enabled).asBool(); + if(!enabled) { + data.outputValue(oa_rigidBodies).set(true); + data.setClean(plug); + return; + } + + MTime time = data.inputValue(ia_time).asTime(); + MTime startTime = data.inputValue(ia_startTime).asTime(); + int subSteps = data.inputValue(ia_substeps).asInt(); + MObject thisObject = thisMObject(); + MPlug plgRigidBodies(thisObject, oa_rigidBodies); + MPlugArray rbConnections; + plgRigidBodies.connectedTo(rbConnections, true, true); + + MPlug plgSplitImpulse(thisObject, ia_splitImpulse); + bool splitImpulseEnabled; + plgSplitImpulse.getValue(splitImpulseEnabled); + + if(time == startTime) { + //first frame, init the simulation + initRigidBodies(rbConnections); + solver_t::set_split_impulse(splitImpulseEnabled); + m_prevTime = time; + } else if(time > m_prevTime && ((time - m_prevTime).value() <= 1.0)) { + //step the simulation forward, + //don't update if we are jumping more than one frame + + float dt = (time - m_prevTime).as(MTime::kSeconds); + + //gather start and end transform for passive rigid bodies, used for interpolation + std::vector passiveXForms; + gatherPassiveTransforms(rbConnections, passiveXForms); + + + //set the gravity in the solver + MPlug plgGravity(thisObject, ia_gravity); + vec3f gravity; + plgGravity.child(0).getValue(gravity[0]); + plgGravity.child(1).getValue(gravity[1]); + plgGravity.child(2).getValue(gravity[2]); + + solver_t::set_gravity(gravity); + + solver_t::set_split_impulse(splitImpulseEnabled); + + for(int i = 1; i <= subSteps; ++i) { + //first update the passive rigid bodies + updatePassiveRigidBodies(rbConnections, passiveXForms, i * dt / subSteps); + + //fields + applyFields(rbConnections, dt / subSteps); + + //step the simulation + solver_t::step_simulation(dt / subSteps); + } + + m_prevTime = time; + + updateActiveRigidBodies(rbConnections); + } + + data.outputValue(oa_rigidBodies).set(true); + data.setClean(plug); +} + +void tokenize(const std::string& str, + std::vector& tokens, + const std::string& delimiters = " ") +{ + // Skip delimiters at beginning. + std::string::size_type lastPos = str.find_first_not_of(delimiters, 0); + // Find first "non-delimiter". + std::string::size_type pos = str.find_first_of(delimiters, lastPos); + + while (std::string::npos != pos || std::string::npos != lastPos) + { + // Found a token, add it to the vector. + tokens.push_back(str.substr(lastPos, pos - lastPos)); + // Skip delimiters. Note the "not_of" + lastPos = str.find_first_not_of(delimiters, pos); + // Find next "non-delimiter" + pos = str.find_first_of(delimiters, lastPos); + } +} + +void replace(std::string &str, std::string const& what, std::string const& with_what) +{ + size_t pos; + while((pos = str.find(what)) != std::string::npos) { + str.replace(pos, pos + what.size(), with_what); + } +} + +bool dSolverNode::expandFileExpression(std::string const& expr, std::string &base_name, std::string &extension) +{ + std::vector tokens; + + //check for extension + tokenize(expr, tokens, "."); + if(tokens.size() < 2) return false; + if(tokens.back().size() != 3) return false; + extension = tokens.back(); + + std::copy(expr.begin(), expr.end() - 4, std::back_inserter(base_name)); + + int time = (int) m_prevTime.value(); + + std::stringstream ss; + ss << time; + std::string str_time(ss.str()); + //replace ${frame} + replace(base_name, "${frame}", str_time); + + //replace ${waveFrame} + while(str_time.size() < 4) str_time = "0" + str_time; + replace(base_name, "${waveFrame}", str_time); + + return true; +} + +void dSolverNode::dumpRigidBodyArray(MObject &node) +{ + // std::cout << "dSolverNode::dumpRigidBodyArray" << std::endl; + + MFnDagNode fnDagNode(node); + rigidBodyArrayNode *rbaNode = static_cast(fnDagNode.userNode()); + + MPlug plgFiles(node, rigidBodyArrayNode::ia_fioFiles); + // MPlug plgPositionAttribute(node, rigidBodyArrayNode::ia_fioPositionAttribute); + // MPlug plgRotationAttribute(node, rigidBodyArrayNode::ia_fioRotationAttribute); + + MString mstr; + plgFiles.getValue(mstr); + std::string expr(mstr.asChar()); + std::string base_path, extension; + if(!expandFileExpression(expr, base_path, extension)) { + std::cout << "dSolverNode::dumpRigidBodyArray: syntax error in file expression: " << std::endl << + expr << std::endl; + return; + } + if(extension != "pdb") { + std::cout << "dSolverNode::dumpRigidBodyArray: only pdb files are supported" << std::endl; + return; + } + std::string file_name = base_path + "." + extension; + + std::vector& rbs = rbaNode->rigid_bodies(); + pdb_io_t pdb_io; + pdb_io.m_num_particles = rbs.size(); + pdb_io.m_time = m_prevTime.value(); + pdb_io.m_attributes.resize(3); + //position + pdb_io.m_attributes[0].m_num_elements = 1; + pdb_io.m_attributes[0].m_name = ATTR_POSITION; + pdb_io.m_attributes[0].m_type = pdb_io_t::kVector; + pdb_io.m_attributes[0].m_vector_data.resize(rbs.size()); + + //rotation angle (in degrees) + pdb_io.m_attributes[1].m_num_elements = 1; + pdb_io.m_attributes[1].m_name = ATTR_IN_RANGLE; + pdb_io.m_attributes[1].m_type = pdb_io_t::kReal; + pdb_io.m_attributes[1].m_real_data.resize(rbs.size()); + + //rotation vector + pdb_io.m_attributes[2].m_num_elements = 1; + pdb_io.m_attributes[2].m_name = ATTR_IN_RAXIS; + pdb_io.m_attributes[2].m_type = pdb_io_t::kVector; + pdb_io.m_attributes[2].m_vector_data.resize(rbs.size()); + + for(size_t i = 0; i < rbs.size(); ++i) { + vec3f pos; + quatf rot; + rbs[i]->get_transform(pos, rot); + pdb_io.m_attributes[0].m_vector_data[i].x = pos[0]; + pdb_io.m_attributes[0].m_vector_data[i].y = pos[1]; + pdb_io.m_attributes[0].m_vector_data[i].z = pos[2]; + + // + vec3f axis; + float angle; + q_to_axis_angle(rot, axis, angle); + pdb_io.m_attributes[1].m_real_data[i] = rad2deg(angle); + + pdb_io.m_attributes[2].m_vector_data[i].x = axis[0]; + pdb_io.m_attributes[2].m_vector_data[i].y = axis[1]; + pdb_io.m_attributes[2].m_vector_data[i].z = axis[2]; + } + + std::ofstream out(file_name.c_str()); + pdb_io.write(out); +} + diff --git a/Extras/MayaPlugin/dSolverNode.h b/Extras/MayaPlugin/dSolverNode.h new file mode 100644 index 000000000..06e52c8ea --- /dev/null +++ b/Extras/MayaPlugin/dSolverNode.h @@ -0,0 +1,92 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//dSolverNode.h + +#ifndef DYN_DSOLVERNODE_H +#define DYN_DSOLVERNODE_H + +#include +#include +#include +#include + +#include + +#include "mathUtils.h" + +class dSolverNode : public MPxNode +{ +public: + dSolverNode(); + virtual ~dSolverNode(); + virtual void postConstructor(); + + static void * creator(); + static MStatus initialize(); + + virtual bool setInternalValueInContext ( const MPlug & plug, const MDataHandle & dataHandle, MDGContext & ctx ); + + virtual MStatus compute( const MPlug& plug, MDataBlock& data ); + + static MObject ia_time; + static MObject ia_startTime; + static MObject ia_gravity; + static MObject ia_enabled; + static MObject ia_splitImpulse; + static MObject ia_substeps; + static MObject oa_rigidBodies; + + //Solver Settings + static MObject ssSolverType; + + // + +public: + static MTypeId typeId; + static MString typeName; + +protected: + + struct xforms_t { + vec3f m_x0; + vec3f m_x1; + quatf m_q0; + quatf m_q1; + }; + + void computeRigidBodies(const MPlug& plug, MDataBlock& data); + void dumpRigidBodyArray(MObject &node); + bool expandFileExpression(std::string const& expr, std::string &base_name, std::string &extension); + + void initRigidBodies(MPlugArray &rbConnections); + void gatherPassiveTransforms(MPlugArray &rbConnections, std::vector &xforms); + void updatePassiveRigidBodies(MPlugArray &rbConnections, std::vector &xforms, float t); + void updateActiveRigidBodies(MPlugArray &rbConnections); + void applyFields(MPlugArray &rbConnections, float dt); + +protected: + MTime m_prevTime; +}; + + +#endif diff --git a/Extras/MayaPlugin/icons/dynamica.xpm b/Extras/MayaPlugin/icons/dynamica.xpm new file mode 100644 index 000000000..93426891b --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamica.xpm @@ -0,0 +1,511 @@ +/* XPM */ +static char * dynamica1_xpm[] = { +"32 32 476 2", +" c #B1B1B1", +". c #B0B0B0", +"+ c #AFAFAF", +"@ c #AAAAAA", +"# c #A8A8A8", +"$ c #ABABAB", +"% c #A6A6A6", +"& c #A9A9A9", +"* c #AAA9A7", +"= c #979288", +"- c #9B9B9B", +"; c #959595", +"> c #9F9F9F", +", c #625236", +"' c #402900", +") c #776C57", +"! c #ADADAD", +"~ c #A0A0A0", +"{ c #9A9A9A", +"] c #776C58", +"^ c #6A5C44", +"/ c #919190", +"( c #898989", +"_ c #908E8B", +": c #47320C", +"< c #5D4D2F", +"[ c #A5A5A5", +"} c #99948B", +"| c #B1B0B0", +"1 c #9E9E9E", +"2 c #8D8D8D", +"3 c #8C8C8C", +"4 c #756B5B", +"5 c #62563F", +"6 c #82817E", +"7 c #736B5C", +"8 c #49340F", +"9 c #908F8E", +"0 c #989898", +"a c #817969", +"b c #442E06", +"c c #48320C", +"d c #ABAAA7", +"e c #AEAEAE", +"f c #868686", +"g c #777267", +"h c #402901", +"i c #47330E", +"j c #432D05", +"k c #524122", +"l c #5B4B2F", +"m c #584626", +"n c #B0AFAF", +"o c #A7A7A7", +"p c #9B9893", +"q c #8E8A83", +"r c #7E7A74", +"s c #412A02", +"t c #72654E", +"u c #929292", +"v c #91908E", +"w c #503D1C", +"x c #422B03", +"y c #514020", +"z c #665A44", +"A c #564526", +"B c #48330D", +"C c #675940", +"D c #80786A", +"E c #918E88", +"F c #969595", +"G c #84817B", +"H c #70685A", +"I c #5D4F36", +"J c #47320D", +"K c #7D7463", +"L c #999999", +"M c #8A8A8A", +"N c #848382", +"O c #534224", +"P c #5D4C2D", +"Q c #8D8579", +"R c #939393", +"S c #776F63", +"T c #574627", +"U c #4C3815", +"V c #675942", +"W c #635438", +"X c #594727", +"Y c #625235", +"Z c #A2A2A2", +"` c #878787", +" . c #817E79", +".. c #47310C", +"+. c #5D4C2E", +"@. c #99948C", +"#. c #909090", +"$. c #79746B", +"%. c #402A01", +"&. c #9E9B94", +"*. c #8F8F8F", +"=. c #827B6F", +"-. c #412A01", +";. c #49340E", +">. c #8E877A", +",. c #9C9C9C", +"'. c #8E8E8E", +"). c #767067", +"!. c #503E1E", +"~. c #4E3A16", +"{. c #969086", +"]. c #A4A4A4", +"^. c #979797", +"/. c #949492", +"(. c #776D5A", +"_. c #6C5E45", +":. c #9D9D9D", +"<. c #949494", +"[. c #767065", +"}. c #514022", +"|. c #3F2900", +"1. c #46300A", +"2. c #9F9B95", +"3. c #ACACAC", +"4. c #A1A1A1", +"5. c #6E6556", +"6. c #5D4E35", +"7. c #4E3A17", +"8. c #8A8274", +"9. c #919191", +"0. c #8B8B8B", +"a. c #6F685B", +"b. c #4D3C1C", +"c. c #3E2800", +"d. c #432E08", +"e. c #63563F", +"f. c #7A7160", +"g. c #53401E", +"h. c #45300A", +"i. c #A09C97", +"j. c #A3A3A3", +"k. c #878786", +"l. c #6B6354", +"m. c #493615", +"n. c #3C2700", +"o. c #472600", +"p. c #672A07", +"q. c #923918", +"r. c #B23610", +"s. c #CC3102", +"t. c #D54012", +"u. c #B04012", +"v. c #8C4118", +"w. c #7A583B", +"x. c #867D6E", +"y. c #A6A4A0", +"z. c #6F675B", +"A. c #564629", +"B. c #432C06", +"C. c #3F2800", +"D. c #9E9E9D", +"E. c #838280", +"F. c #675D4D", +"G. c #44300F", +"H. c #3B2600", +"I. c #3A2500", +"J. c #54280B", +"K. c #762B12", +"L. c #882000", +"M. c #A02600", +"N. c #B82B00", +"O. c #CF3100", +"P. c #E13B07", +"Q. c #E44E1F", +"R. c #E76036", +"S. c #C9623C", +"T. c #864B24", +"U. c #4D3915", +"V. c #8A8780", +"W. c #4E3C1C", +"X. c #7F7D77", +"Y. c #7E7D7B", +"Z. c #615644", +"`. c #3F2D0A", +" + c #392500", +".+ c #493819", +"++ c #674231", +"@+ c #5E1701", +"#+ c #701B00", +"$+ c #A32600", +"%+ c #BC2C00", +"&+ c #D43200", +"*+ c #E13E0B", +"=+ c #E45224", +"-+ c #E7653D", +";+ c #EA7652", +">+ c #EB8363", +",+ c #9B6241", +"'+ c #7F7F7F", +")+ c #838383", +"!+ c #4D3E22", +"~+ c #392400", +"{+ c #4D3F26", +"]+ c #3C2906", +"^+ c #382300", +"/+ c #372300", +"(+ c #4A3A1D", +"_+ c #787268", +":+ c #79615A", +"<+ c #4F1301", +"[+ c #5B1600", +"}+ c #731B00", +"|+ c #8D2100", +"1+ c #AA2800", +"2+ c #C32E00", +"3+ c #D93300", +"4+ c #E2410F", +"5+ c #E55427", +"6+ c #E86840", +"7+ c #EB7B58", +"8+ c #ED8B6D", +"9+ c #EE977C", +"0+ c #CBA89E", +"a+ c #969696", +"b+ c #888888", +"c+ c #797979", +"d+ c #737373", +"e+ c #5B5446", +"f+ c #372603", +"g+ c #352200", +"h+ c #342100", +"i+ c #4A3C23", +"j+ c #78746C", +"k+ c #877F7C", +"l+ c #542A1D", +"m+ c #4C1200", +"n+ c #5F1600", +"o+ c #7A1D00", +"p+ c #982400", +"q+ c #B32A00", +"r+ c #CA3000", +"s+ c #DD3400", +"t+ c #E24210", +"u+ c #E55326", +"v+ c #E8663E", +"w+ c #EE8E70", +"x+ c #F09D83", +"y+ c #E5A794", +"z+ c #BBAFAB", +"A+ c #848484", +"B+ c #6A6A69", +"C+ c #9D8100", +"D+ c #DCB600", +"E+ c #F7CC00", +"F+ c #F3C900", +"G+ c #EDC400", +"H+ c #E6BE00", +"I+ c #E0B900", +"J+ c #DBB500", +"K+ c #D8B300", +"L+ c #936800", +"M+ c #421000", +"N+ c #4E1200", +"O+ c #651800", +"P+ c #831F00", +"Q+ c #BD2D00", +"R+ c #D13100", +"S+ c #DF3500", +"T+ c #E45022", +"U+ c #E7633A", +"V+ c #EA7855", +"W+ c #F09F86", +"X+ c #F2AA94", +"Y+ c #CEAFA5", +"Z+ c #7B7B7B", +"`+ c #6B6B6B", +" @ c #666564", +".@ c #746000", +"+@ c #D1AC00", +"@@ c #F9CE03", +"#@ c #F4CA03", +"$@ c #EDC403", +"%@ c #E6BE03", +"&@ c #E0B903", +"*@ c #DBB503", +"=@ c #D8B303", +"-@ c #6D4101", +";@ c #431000", +">@ c #521300", +",@ c #6B1900", +"'@ c #8C2100", +")@ c #AB2900", +"!@ c #C52F00", +"~@ c #D53300", +"{@ c #E03500", +"]@ c #E13F0C", +"^@ c #E34B1C", +"/@ c #E65D33", +"(@ c #EA744F", +"_@ c #F0A087", +":@ c #F2AD97", +"<@ c #DFB1A3", +"[@ c #7D7D7D", +"}@ c #727272", +"|@ c #6E6E6E", +"1@ c #655300", +"2@ c #C9A500", +"3@ c #F8CC00", +"4@ c #F2C700", +"5@ c #EBC200", +"6@ c #E4BC00", +"7@ c #DEB700", +"8@ c #DAB400", +"9@ c #D7B100", +"0@ c #502300", +"a@ c #441000", +"b@ c #541400", +"c@ c #922300", +"d@ c #B12A00", +"e@ c #C93000", +"f@ c #D83300", +"g@ c #E13C09", +"h@ c #E34717", +"i@ c #E6592E", +"j@ c #E9704A", +"k@ c #ED896A", +"l@ c #F09E85", +"m@ c #EBB2A0", +"n@ c #818181", +"o@ c #787878", +"p@ c #C8A400", +"q@ c #F7CB00", +"r@ c #F1C600", +"s@ c #E9C000", +"t@ c #E2BA00", +"u@ c #DDB600", +"v@ c #D9B300", +"w@ c #3F1000", +"x@ c #551400", +"y@ c #711B00", +"z@ c #932300", +"A@ c #B22A00", +"B@ c #E34615", +"C@ c #E5562A", +"D@ c #E96D47", +"E@ c #ED8767", +"F@ c #F09C82", +"G@ c #F2AC96", +"H@ c #F2B19D", +"I@ c #808080", +"J@ c #747474", +"K@ c #F6CB00", +"L@ c #DCB500", +"M@ c #D6B000", +"N@ c #502200", +"O@ c #531400", +"P@ c #6E1A00", +"Q@ c #8F2200", +"R@ c #AF2900", +"S@ c #C72F00", +"T@ c #D63300", +"U@ c #E96C46", +"V@ c #EC8464", +"W@ c #EF9A7F", +"X@ c #F2A992", +"Y@ c #EBAF9D", +"Z@ c #6C4100", +"`@ c #410F00", +" # c #4F1300", +".# c #671800", +"+# c #862000", +"@# c #A52700", +"## c #BF2D00", +"$# c #DC3400", +"%# c #E34616", +"&# c #E5572B", +"*# c #EC8363", +"=# c #EF977C", +"-# c #F1A48C", +";# c #DEAB9C", +"># c #926800", +",# c #3F0F00", +"'# c #4A1100", +")# c #5E1600", +"!# c #D73300", +"~# c #E03804", +"{# c #E5582C", +"]# c #EC8160", +"^# c #EE9276", +"/# c #F09E84", +"(# c #CEAA9F", +"_# c #F9CD00", +":# c #F4C900", +"<# c #EDC300", +"[# c #E6BD00", +"}# c #E0B800", +"|# c #DBB400", +"1# c #D8B200", +"2# c #C09800", +"3# c #5C2F08", +"4# c #451000", +"5# c #6C1A00", +"6# c #A32700", +"7# c #BB2C00", +"8# c #CE3100", +"9# c #E24413", +"0# c #E86942", +"a# c #EB7C59", +"b# c #E39A84", +"c# c #BBADA9", +"d# c #828282", +"e# c #767676", +"f# c #C9A600", +"g# c #FACE00", +"h# c #F0C600", +"i# c #E3BB00", +"j# c #9B7318", +"k# c #451101", +"l# c #4D1200", +"m# c #601700", +"n# c #781C00", +"o# c #AC2900", +"p# c #C22E00", +"q# c #E45123", +"r# c #E7643B", +"s# c #EA7450", +"t# c #EC8262", +"u# c #C9A194", +"v# c #CAA600", +"w# c #FCD000", +"x# c #F3C800", +"y# c #E8BF00", +"z# c #DABA29", +"A# c #916D34", +"B# c #4D1301", +"C# c #591500", +"D# c #9E2500", +"E# c #B62B00", +"F# c #CD3000", +"G# c #E03702", +"H# c #E34A1A", +"I# c #E65C31", +"J# c #E86D46", +"K# c #CC9482", +"L# c #6E5B00", +"M# c #F6CA00", +"N# c #DAB300", +"O# c #DEBD20", +"P# c #DDC65E", +"Q# c #7C635B", +"R# c #662E1D", +"S# c #691900", +"T# c #7E1E00", +"U# c #952300", +"V# c #AD2900", +"W# c #DA3400", +"X# c #DA6440", +"Y# c #C6907F", +"Z# c #8A7200", +"`# c #C4A100", +" $ c #DFB700", +".$ c #DCB400", +"+$ c #D5AF00", +"@$ c #D0AB00", +"#$ c #CDA800", +"$$ c #E4BC01", +"%$ c #E2C53B", +"&$ c #948884", +"*$ c #896357", +"=$ c #8A4632", +"-$ c #963214", +";$ c #A92902", +">$ c #BC3C14", +",$ c #C75735", +"'$ c #C57B64", +")$ c #B79F98", +" ", +" . . . + @ # $ . ", +" . @ % & * = @ - ; > , ' ) + + . ", +" ! ~ ; { ] ' ^ / ( _ : ' < [ [ ! } = | ", +" ! 1 2 3 4 ' ' 5 6 7 ' ' 8 9 0 a b c d ", +" . . . . e ~ 2 f g h ' ' i j ' ' h k l ' ' m n ", +" e o [ o p q 3 f r s ' ' ' ' ' ' ' ' ' ' ' t ", +" . & { u v w x y z A ' B C D E F G H I J ' ' K $ + ", +" . & L M N O ' ' ' ' P Q . + ! # > R 3 S T ' U V W X Y * ", +" e Z u ` ...' ' +.@. . $ ~ #.( $.O ' ' ' ' %.&. ", +" . $ - 3 *.=.-.;.>. . + ! % ,.'.f ).!.' ' ' ~.{. ", +". ! @ ].^.'./.(.%._. . . + $ [ :.<.2 [.}.|.' s ' 1.2. ", +"3.4.0 u 5.6.7.' ' 8.. + @ ].{ 9.0.a.b.c.c.d.e.f.' g.. ", +"@ L 2 ` h.' ' ' ' i.@ j.L #.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y. ", +"3.4.; 3 z.A.B.C.C.D.^.3 E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U. ", +"! & ].L M ( V.W.n.X.Y.Z.`.I. +.+++@+#+L.$+%+&+*+=+-+;+>+,+ ", +"$ # ].L f '+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+9+0+ ", +"o 4.a+b+c+d+e+f+g+h+h+i+j+9.k+l+m+n+o+p+q+r+s+t+u+v+7+w+x+y+z+ ", +"Z a+A+d+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+$+Q+R+S+4+T+U+V+w+W+X+Y+ ", +"1 *.Z+`+ @.@+@@@#@$@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@8+_@:@<@ ", +"- 2 [@}@|@1@2@3@4@5@6@7@8@9@0@a@b@#+c@d@e@f@{@g@h@i@j@k@l@:@m@ ", +"L 0.n@o@d+1@p@q@r@s@t@u@v@9@w@a@x@y@z@A@r+3+{@P.B@C@D@E@F@G@H@ ", +"^.0.I@c+J@1@p@K@r@s@t@L@v@M@N@M+O@P@Q@R@S@T@S+P.B@C@U@V@W@X@Y@ ", +"^.0.I@c+J@1@p@q@r@s@t@u@v@9@Z@`@ #.#+#@###R+$#P.%#&#U@*#=#-#;# ", +"^.0.I@c+J@1@2@3@4@5@6@7@8@9@>#,#'#)#o+p+q+S@!#~#%#{#U@]#^#/#(# ", +"^.0.I@c+J@1@2@_#:#<#[#}#|#1#2#3#4#b@5#L.6#7#8#S+9#C@0#a#8+b#c# ", +"L 3 d#Z+e#1@f#g#K@h#s@i#7@|#1#j#k#l#m#n#z@o#p#T@]@q#r#s#t#u# ", +"- *.f I@Z+1@v#w#3@x#<#y#t@7@|#z#A#B#C#P@+#D#E#F#G#H#I#J#K# ", +"1 <.3 f d#L#2@M#x#h#5@H+t@u@N#O#P#Q#R#S#T#U#V#2+W#t+X#Y#. ", +"Z { <.*.3 Z#`# $u@.$1#+$@$#$v#$$%$:.&$*$=$-$;$>$,$'$)$. ", +"o Z 1 - L ^.^.^.a+^.0 L { :.> ~ 4.Z Z j.[ o & $ e + . ", +"$ # [ ].Z Z Z Z 4.4.Z Z j.[ % % % o o # & $ 3.e + . . "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreateActiveBoxRB.xpm b/Extras/MayaPlugin/icons/dynamicaCreateActiveBoxRB.xpm new file mode 100644 index 000000000..0e676dcdc --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreateActiveBoxRB.xpm @@ -0,0 +1,114 @@ +/* XPM */ +static char * dynamicaCreateActiveBoxRB_xpm[] = { +"32 32 79 1", +" c #A47D7D", +". c #A53030", +"+ c #AA2424", +"@ c #AD5E5E", +"# c #B1B1B1", +"$ c #880202", +"% c #A61B1B", +"& c #A80101", +"* c #AD5A5A", +"= c #850000", +"- c #C30000", +"; c #B1ADAD", +"> c #A88C8C", +", c #860202", +"' c #A17070", +") c #A17373", +"! c #898989", +"~ c #969696", +"{ c #9C9C9C", +"] c #A7A7A7", +"^ c #0F0F0F", +"/ c #707070", +"( c #ABABAB", +"_ c #737373", +": c #2C2C2C", +"< c #000000", +"[ c #8E8E8E", +"} c #7F7F7F", +"| c #080808", +"1 c #6E6E6E", +"2 c #0C0C0C", +"3 c #A2A2A2", +"4 c #4F4F4F", +"5 c #212121", +"6 c #ADADAD", +"7 c #494949", +"8 c #4B4B4B", +"9 c #606060", +"0 c #131313", +"a c #060606", +"b c #1D1D1D", +"c c #7D7D7D", +"d c #858585", +"e c #929292", +"f c #A0A0A0", +"g c #797979", +"h c #626262", +"i c #6C6C6C", +"j c #414141", +"k c #454545", +"l c #2A2A2A", +"m c #434343", +"n c #7C7C7C", +"o c #5A5A5A", +"p c #121212", +"q c #2F2F2F", +"r c #141414", +"s c #686868", +"t c #A9A9A9", +"u c #818181", +"v c #5C5C5C", +"w c #646464", +"x c #2D2D2D", +"y c #050505", +"z c #151515", +"A c #575757", +"B c #636363", +"C c #555555", +"D c #6A6A6A", +"E c #3C3C3C", +"F c #111111", +"G c #666666", +"H c #090909", +"I c #515151", +"J c #5B5B5B", +"K c #5F5F5F", +"L c #616161", +"M c #A5A5A5", +"N c #959595", +" .+++++++++++++@################", +" $%&&&&&&&&&&&&&*###############", +" =$%&&&&&&&&&&&&&*##############", +" ==$%&&&&&&&&&&&&&*#############", +" ===$--------------;############", +" ====--------------#############", +" ====--------------#############", +" ====--------------#############", +" ====--------------#############", +" ====--------------#############", +" ====--------------#############", +" ====--------------#############", +" ====--------------#############", +">,===--------------#############", +"#',==--------------#############", +"##),=--------------#############", +"###),--------------#############", +"####)--------------#############", +"##########!###############~{####", +"#########]^/###########(_:<[####", +"##########}|~#########12<<<3####", +"###########456########67<<|#####", +"###########658#########90ab#####", +"############~|c#######da[e8#####", +"#############/^fgh###f^i########", +"##############j0 c #8E8E8E", +", c #7F7F7F", +"' c #080808", +") c #6E6E6E", +"! c #0C0C0C", +"~ c #A2A2A2", +"{ c #4F4F4F", +"] c #212121", +"^ c #ADADAD", +"/ c #494949", +"( c #4B4B4B", +"_ c #606060", +": c #131313", +"< c #060606", +"[ c #1D1D1D", +"} c #7D7D7D", +"| c #858585", +"1 c #929292", +"2 c #A0A0A0", +"3 c #797979", +"4 c #626262", +"5 c #6C6C6C", +"6 c #414141", +"7 c #454545", +"8 c #2A2A2A", +"9 c #434343", +"0 c #7C7C7C", +"a c #5A5A5A", +"b c #121212", +"c c #2F2F2F", +"d c #141414", +"e c #686868", +"f c #A9A9A9", +"g c #818181", +"h c #5C5C5C", +"i c #646464", +"j c #2D2D2D", +"k c #050505", +"l c #151515", +"m c #575757", +"n c #636363", +"o c #555555", +"p c #6A6A6A", +"q c #3C3C3C", +"r c #111111", +"s c #666666", +"t c #090909", +"u c #515151", +"v c #5B5B5B", +"w c #5F5F5F", +"x c #616161", +"y c #A5A5A5", +"z c #959595", +" ", +" ", +" ", +" ....... ....... ", +" . . . . ", +" . . . . ", +" . . . . ", +" . . . . ", +" . . . . ", +" ....... ....... ", +" ", +" ....... ....... ", +" . . . . ", +" . . . . ", +" . . . . ", +" . . . . ", +" . . . . ", +" ....... ....... ", +" + @# ", +" $%& *=-;> ", +" ,'@ )!;;;~ ", +" {]^ ^/;;' ", +" ^]( _:<[ ", +" @'} |<>1( ", +" &%234 2%5 ", +" 6:;7 ^89 ", +" 055555555555ab;;]55cde555)f ", +" ghiiiiiiiii4jk;;li9 c #CE4949", +", c #C56A6A", +"' c #BE8181", +") c #B89696", +"! c #B5A2A2", +"~ c #CC4F4F", +"{ c #DD0E0E", +"] c #AE2121", +"^ c #AB8888", +"/ c #ACACAC", +"( c #7A7A7A", +"_ c #8D8D8D", +": c #BB8E8E", +"< c #C17979", +"[ c #C66464", +"} c #CE4747", +"| c #D62C2C", +"1 c #DC1717", +"2 c #DA1D1D", +"3 c #D43232", +"4 c #CE4646", +"5 c #BC6161", +"6 c #AE6F6F", +"7 c #B28D8D", +"8 c #B69E9E", +"9 c #CD4B4B", +"0 c #DF0C0C", +"a c #B19999", +"b c #686868", +"c c #ABABAB", +"d c #C4C4C4", +"e c #727272", +"f c #6A6A6A", +"g c #6E6E6E", +"h c #717171", +"i c #7C7C7C", +"j c #A3A3A3", +"k c #BA9090", +"l c #A56060", +"m c #8F2F2F", +"n c #AE2626", +"o c #C21B1B", +"p c #D50909", +"q c #D32D2D", +"r c #B79A9A", +"s c #DE0F0F", +"t c #C65151", +"u c #867676", +"v c #666666", +"w c #595959", +"x c #B6B6B6", +"y c #9F9F9F", +"z c #999999", +"A c #959595", +"B c #8A8A8A", +"C c #797979", +"D c #5D5D5D", +"E c #A1A1A1", +"F c #AEAEAE", +"G c #7D7D7D", +"H c #C81111", +"I c #BA7878", +"J c #B2ADAD", +"K c #DC1414", +"L c #B95252", +"M c #8B7E7E", +"N c #5A5A5A", +"O c #919191", +"P c #C2C2C2", +"Q c #CACACA", +"R c #C7C7C7", +"S c #C3C3C3", +"T c #C0C0C0", +"U c #BDBDBD", +"V c #B9B9B9", +"W c #B7B7B7", +"X c #B5B5B5", +"Y c #696969", +"Z c #8F8F8F", +"` c #6D6D6D", +" . c #969696", +".. c #767676", +"+. c #965B5B", +"@. c #D91C1C", +"#. c #937373", +"$. c #D20A0A", +"%. c #888888", +"&. c #BBBBBB", +"*. c #CDCDCD", +"=. c #CCCCCC", +"-. c #C8C8C8", +";. c #C5C5C5", +">. c #C1C1C1", +",. c #BEBEBE", +"'. c #B4B4B4", +"). c #B3B3B3", +"!. c #9C9C9C", +"~. c #676767", +"{. c #A8A8A8", +"]. c #B0B0B0", +"^. c #616161", +"/. c #C37070", +"(. c #855050", +"_. c #D82B2B", +":. c #A7A7A7", +"<. c #B2B2B2", +"[. c #6C6C6C", +"}. c #818181", +"|. c #808080", +"1. c #946A6A", +"2. c #DC1515", +"3. c #B25D5D", +"4. c #DF1414", +"5. c #575454", +"6. c #CBCBCB", +"7. c #BABABA", +"8. c #B8B8B8", +"9. c #9E9E9E", +"0. c #7F7F7F", +"a. c #656565", +"b. c #C93939", +"c. c #C76060", +"d. c #6D6B6B", +"e. c #DC2D2D", +"f. c #924545", +"g. c #828282", +"h. c #A2A2A2", +"i. c #634848", +"j. c #DE0C0C", +"k. c #B3A9A9", +"l. c #9E5454", +"m. c #D42A2A", +"n. c #C6C6C6", +"o. c #BC3A3A", +"p. c #CF4343", +"q. c #8D8A8A", +"r. c #D50B0B", +"s. c #C49F9F", +"t. c #9F4D4D", +"u. c #DD1313", +"v. c #AA3D3D", +"w. c #C13F3F", +"x. c #A0A0A0", +"y. c #A05353", +"z. c #9B8686", +"A. c #DA0808", +"B. c #BCB1B1", +"C. c #5E5E5E", +"D. c #A55D5D", +"E. c #DD1111", +"F. c #BA9292", +"G. c #BE2929", +"H. c #B24242", +"I. c #B5B2B2", +"J. c #626262", +"K. c #9E5C5C", +"L. c #B48989", +"M. c #CA1C1C", +"N. c #D30E0E", +"O. c #BA5F5F", +"P. c #A5A5A5", +"Q. c #858585", +"R. c #9D6060", +"S. c #9E6B6B", +"T. c #BB1919", +"U. c #D70C0C", +"V. c #AB4C4C", +"W. c #8E7E7E", +"X. c #9A6D6D", +"Y. c #9E5E5E", +"Z. c #A34949", +"`. c #A83333", +" + c #AB2323", +".+ c #CA1D1D", +"++ c #D62121", +"@+ c #E10404", +"#+ c #BD8787", +"$+ c #9C7272", +"%+ c #C22929", +"&+ c #E10101", +"*+ c #CD1818", +"=+ c #C82121", +"-+ c #BE3737", +";+ c #BE4C4C", +">+ c #C06666", +",+ c #898989", +"'+ c #0F0F0F", +")+ c #707070", +"!+ c #737373", +"~+ c #2C2C2C", +"{+ c #000000", +"]+ c #8E8E8E", +"^+ c #080808", +"/+ c #0C0C0C", +"(+ c #4F4F4F", +"_+ c #212121", +":+ c #ADADAD", +"<+ c #494949", +"[+ c #4B4B4B", +"}+ c #606060", +"|+ c #131313", +"1+ c #060606", +"2+ c #1D1D1D", +"3+ c #929292", +"4+ c #414141", +"5+ c #454545", +"6+ c #2A2A2A", +"7+ c #434343", +"8+ c #121212", +"9+ c #2F2F2F", +"0+ c #141414", +"a+ c #A9A9A9", +"b+ c #5C5C5C", +"c+ c #646464", +"d+ c #2D2D2D", +"e+ c #050505", +"f+ c #151515", +"g+ c #575757", +"h+ c #636363", +"i+ c #555555", +"j+ c #3C3C3C", +"k+ c #111111", +"l+ c #090909", +"m+ c #515151", +"n+ c #5B5B5B", +"o+ c #5F5F5F", +" . + @ ", +" # $ % & * = - ; > , ' ) ", +" ! ~ { ] ^ / ( _ : < [ } | 1 = 2 3 4 5 6 7 ", +" 8 9 0 9 a b c d e b f g h i j k l m n o p q ", +" r } s t u v w h / d x j y z A B C A D E F G H I ", +"J K L M N O P Q R S T U V W X X Y Z ` . ..+.@. ", +"#.$.e %.&.*.=.Q -.;.>.,.&.W X '.).!.~.{.N ].E ^.3 /. ", +"(._.:.E *.=.Q -.;.P ,.&.V X ).<. [.( }. |.1.2.J ", +"3.4.5.b *.6.-.;.P ,.7.8.x ). 9.0.]. a.b.c. ", +"d.e.f.g.Q -.;.P ,.V x '.<. h.i.j.k. ", +"C l.m.c n.d T U V '. g o.p. ", +" q.r.s.>.,.&.W ). c ..t.u.r ", +" v.w.U 7.W ). x.D y.u.) ", +" z.A.B.W '. {.C.D.E.F. ", +" G.H.I. :.J.K.s : ", +" L.M.N.O.J P.Q.N R.0 . ", +" S.T.U.V.W.X.Y.Z.`. +.+++@+#+ ", +" c $+%+&+*+=+-+;+>+' : J ", +" ,+ .!. ", +" :.'+)+ c !+~+{+]+ ", +" 0.^+ . g /+{+{+{+h. ", +" (+_+:+ :+<+{+{+^+ ", +" :+_+[+ }+|+1+2+ ", +" .^+G Q.1+]+3+[+ ", +" )+'+x.C J. x.'+[. ", +" 4+|+{+5+ :+6+7+ ", +" i [.[.[.[.[.[.[.[.[.[.[.N 8+{+{+_+[.[.9+0+b [.[.[.g a+ ", +" }.b+c+c+c+c+c+c+c+c+c+J.d+e+{+{+f+c+7+1+g+c+c+c+c+h+i+a+ ", +" }.b+b f f f f f f f f f c+j+k+/+v l+[+f f f f f f b i+a+ ", +" }.b+b f f f f f f f f f f f m+f h+f f f f f f f f b i+ ", +" }.n+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+o+^. ", +" P.A A A A A A A A A A A A A A A A A A A A A A A A "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreateActiveHullRBArray.xpm b/Extras/MayaPlugin/icons/dynamicaCreateActiveHullRBArray.xpm new file mode 100644 index 000000000..ef18e1cbd --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreateActiveHullRBArray.xpm @@ -0,0 +1,145 @@ +/* XPM */ +static char * dynamicaCreateActiveHullRBArray_xpm[] = { +"32 32 110 2", +" c #B1B1B1", +". c #B3ABAB", +"+ c #C17777", +"@ c #CA5757", +"# c #C66464", +"$ c #C27272", +"% c #BD8484", +"& c #B99595", +"* c #B5A2A2", +"= c #B3A9A9", +"- c #CB5454", +"; c #C37070", +"> c #B79A9A", +", c #BE8383", +"' c #C27575", +") c #C76363", +"! c #C95C5C", +"~ c #C85E5E", +"{ c #C76262", +"] c #C56A6A", +"^ c #BB8E8E", +"/ c #CA5555", +"( c #C27474", +"_ c #B4A5A5", +": c #B3AAAA", +"< c #CE4747", +"[ c #C95B5B", +"} c #B89696", +"| c #BE8080", +"1 c #B89797", +"2 c #BC8A8A", +"3 c #C66767", +"4 c #C36E6E", +"5 c #B2AEAE", +"6 c #CA5858", +"7 c #B4A7A7", +"8 c #BF7F7F", +"9 c #C95A5A", +"0 c #C07979", +"a c #BE8181", +"b c #C37171", +"c c #BD8585", +"d c #C17878", +"e c #C46C6C", +"f c #B3A8A8", +"g c #946464", +"h c #969696", +"i c #9C9C9C", +"j c #BD5757", +"k c #110707", +"l c #726B6B", +"m c #ABABAB", +"n c #737373", +"o c #2C2C2C", +"p c #000000", +"q c #8E8E8E", +"r c #7F7F7F", +"s c #080808", +"t c #6E6E6E", +"u c #0C0C0C", +"v c #A2A2A2", +"w c #4F4F4F", +"x c #212121", +"y c #ADADAD", +"z c #494949", +"A c #4B4B4B", +"B c #606060", +"C c #131313", +"D c #060606", +"E c #1D1D1D", +"F c #7D7D7D", +"G c #858585", +"H c #929292", +"I c #707070", +"J c #0F0F0F", +"K c #A0A0A0", +"L c #797979", +"M c #626262", +"N c #6C6C6C", +"O c #414141", +"P c #454545", +"Q c #2A2A2A", +"R c #434343", +"S c #7C7C7C", +"T c #5A5A5A", +"U c #121212", +"V c #2F2F2F", +"W c #141414", +"X c #686868", +"Y c #A9A9A9", +"Z c #818181", +"` c #5C5C5C", +" . c #646464", +".. c #2D2D2D", +"+. c #050505", +"@. c #151515", +"#. c #575757", +"$. c #636363", +"%. c #555555", +"&. c #6A6A6A", +"*. c #3C3C3C", +"=. c #111111", +"-. c #666666", +";. c #090909", +">. c #515151", +",. c #5B5B5B", +"'. c #5F5F5F", +"). c #616161", +"!. c #A5A5A5", +"~. c #959595", +" ", +" . + @ # $ % & * = ", +" = + - ; > & , ' ) ! ~ { ] ", +" ^ / ( _ : ^ < ", +" [ } ( | . + @ # $ % & * = ", +" @ 1 = / = = + - ; > & , ' ) ! ~ { ] ", +" 2 3 4 ; ^ / ( _ : ^ < ", +" 5 6 7 8 9 . [ } ( | ", +" 0 ) 7 a / : @ 1 = / = ", +" 5 ' - b c d e ! 6 f 2 3 4 ; ", +" 5 6 7 8 9 . ", +" . + @ # $ % & * = 0 ) 7 a / : ", +" = + - ; > & , ' ) ! ~ { ] 5 ' - b c d e ! 6 f ", +" ^ / ( _ : ^ < ", +" [ } ( | ", +" @ 1 = / = ", +" 2 3 4 ; ", +" 5 6 7 8 9 . ", +" 0 ) 7 g / : h i ", +" 5 ' - b c d e j k l m n o p q ", +" r s h t u p p p v ", +" w x y y z p p s ", +" y x A B C D E ", +" h s F G D q H A ", +" I J K L M K J N ", +" O C p P y Q R ", +" S N N N N N N N N N N N T U p p x N N V W X N N N t Y ", +" Z ` . . . . . . . . .M ..+.p p @. .R D #. . . . .$.%.Y ", +" Z ` X &.&.&.&.&.&.&.&.&. .*.=.u -.;.A &.&.&.&.&.&.X %.Y ", +" Z ` X &.&.&.&.&.&.&.&.&.&.&.>.&.$.&.&.&.&.&.&.&.&.X %. ", +" Z ,.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.). ", +" !.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~. "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreateActiveMeshRB.xpm b/Extras/MayaPlugin/icons/dynamicaCreateActiveMeshRB.xpm new file mode 100644 index 000000000..0d1bc6c39 --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreateActiveMeshRB.xpm @@ -0,0 +1,247 @@ +/* XPM */ +static char * dynamicaCreateActiveMeshRB_xpm[] = { +"32 32 212 2", +" c #B1B1B1", +". c #A7A7A7", +"+ c #989898", +"@ c #939393", +"# c #A2A2A2", +"$ c #AFAFAF", +"% c #918888", +"& c #BC5B5B", +"* c #C34949", +"= c #A56969", +"- c #A3A3A3", +"; c #ABABAB", +"> c #A8A8A8", +", c #AEAEAE", +"' c #959595", +") c #C35858", +"! c #D13D3D", +"~ c #A07171", +"{ c #969696", +"] c #979797", +"^ c #9C9C9C", +"/ c #ACACAC", +"( c #8C8B8B", +"_ c #957777", +": c #996B6B", +"< c #918080", +"[ c #ADADAD", +"} c #9E9E9E", +"| c #949494", +"1 c #A07C7C", +"2 c #C35A5A", +"3 c #D23E3E", +"4 c #C93B3B", +"5 c #BD4141", +"6 c #BA3C3C", +"7 c #B63939", +"8 c #B33B3B", +"9 c #AD4848", +"0 c #9B9B9B", +"a c #A6A6A6", +"b c #937E7E", +"c c #BA2020", +"d c #C10404", +"e c #A54C4C", +"f c #908282", +"g c #A0A0A0", +"h c #B37272", +"i c #C76464", +"j c #D15959", +"k c #D65151", +"l c #D44848", +"m c #D13C3C", +"n c #CF3131", +"o c #CC2626", +"p c #C91B1B", +"q c #C71212", +"r c #C60E0E", +"s c #C60D0D", +"t c #9A6E6E", +"u c #A4A4A4", +"v c #B42D2D", +"w c #C30000", +"x c #A15757", +"y c #A1A1A1", +"z c #8F8989", +"A c #A07D7D", +"B c #AE7676", +"C c #CD6565", +"D c #D85B5B", +"E c #D75757", +"F c #D65252", +"G c #D54C4C", +"H c #D34242", +"I c #CF3535", +"J c #CD2B2B", +"K c #CB2020", +"L c #C81515", +"M c #C60C0C", +"N c #C50909", +"O c #C50707", +"P c #B72323", +"Q c #917F7F", +"R c #C20202", +"S c #BA1717", +"T c #929292", +"U c #9B7F7F", +"V c #CB5A5A", +"W c #C16767", +"X c #BE6D6D", +"Y c #D95D5D", +"Z c #D85959", +"` c #D34343", +" . c #D03737", +".. c #CB2222", +"+. c #C91919", +"@. c #C40606", +"#. c #C30202", +"$. c #9C6464", +"%. c #A84646", +"&. c #A74848", +"*. c #9F9F9F", +"=. c #B66565", +"-. c #D25050", +";. c #8D8D8D", +">. c #9A8383", +",. c #D85A5A", +"'. c #D75454", +"). c #D03838", +"!. c #CD2929", +"~. c #CA1E1E", +"{. c #C81717", +"]. c #C71010", +"^. c #B81B1B", +"/. c #976F6F", +"(. c #A9A9A9", +"_. c #9C7B7B", +":. c #D44949", +"<. c #9A8080", +"[. c #AB7575", +"}. c #D75353", +"|. c #CD2A2A", +"1. c #C60B0B", +"2. c #C40303", +"3. c #BA1616", +"4. c #8D8A8A", +"5. c #A76E6E", +"6. c #C35353", +"7. c #C35757", +"8. c #D34545", +"9. c #CF3232", +"0. c #CC2727", +"a. c #9D6262", +"b. c #9C7878", +"c. c #CD3B3B", +"d. c #CF3434", +"e. c #C81414", +"f. c #C00808", +"g. c #A15656", +"h. c #9A9A9A", +"i. c #B45252", +"j. c #C71313", +"k. c #BA1818", +"l. c #937A7A", +"m. c #9D9D9D", +"n. c #9F6D6D", +"o. c #BE0E0E", +"p. c #937979", +"q. c #AA5151", +"r. c #BD0F0F", +"s. c #967373", +"t. c #9C6565", +"u. c #B91A1A", +"v. c #BC1212", +"w. c #AA4141", +"x. c #8F8383", +"y. c #A94242", +"z. c #AB3C3C", +"A. c #A35252", +"B. c #9A6969", +"C. c #898989", +"D. c #0F0F0F", +"E. c #707070", +"F. c #737373", +"G. c #2C2C2C", +"H. c #000000", +"I. c #8E8E8E", +"J. c #7F7F7F", +"K. c #080808", +"L. c #6E6E6E", +"M. c #0C0C0C", +"N. c #4F4F4F", +"O. c #212121", +"P. c #494949", +"Q. c #4B4B4B", +"R. c #606060", +"S. c #131313", +"T. c #060606", +"U. c #1D1D1D", +"V. c #7D7D7D", +"W. c #858585", +"X. c #797979", +"Y. c #626262", +"Z. c #6C6C6C", +"`. c #414141", +" + c #454545", +".+ c #2A2A2A", +"++ c #434343", +"@+ c #7C7C7C", +"#+ c #5A5A5A", +"$+ c #121212", +"%+ c #2F2F2F", +"&+ c #141414", +"*+ c #686868", +"=+ c #818181", +"-+ c #5C5C5C", +";+ c #646464", +">+ c #2D2D2D", +",+ c #050505", +"'+ c #151515", +")+ c #575757", +"!+ c #636363", +"~+ c #555555", +"{+ c #6A6A6A", +"]+ c #3C3C3C", +"^+ c #111111", +"/+ c #666666", +"(+ c #090909", +"_+ c #515151", +":+ c #5B5B5B", +"<+ c #5F5F5F", +"[+ c #616161", +"}+ c #A5A5A5", +" ", +" . + @ # ", +" $ % & * = - ; > , ", +" $ ' ) ! ~ ' { ] + ^ / # ( _ : < , ", +" [ } | % 1 2 3 4 5 6 7 8 9 0 a b c d e f , ", +" $ . g % h i j k l m n o p q r s t u ] v w x ^ , ", +"y z A B C D E F G H I J K L M N O P ' , Q R S T ", +"U V W X Y Z F G ` .J ..+.r @.#.w w $.^ %.w &.*. ", +"=.-.;.>.,.'.G ` ).!.~.{.].@.w w w w ^.&.R w /.(. ", +"_.:.<.[.}.G H .|.p ].1.2.w w w w w w w w 3.4. ", +"0 5.6.7.8.! 9.0.+.N w w w w w w w w w w w a.y ", +" - b.c.d.J K e.@.w w w w w w w w w w f.g.0 ", +" h.i.0.~.j.@.w w w w w w w w w w k.l.m. ", +" a n.~.e.N w w w w w w w w w w o.p.# ", +" 0 q.1.w w w w w w w w w w r.s.*. ", +" , 0 t.u.w w w w w w w v.w.Q *. ", +" # x.x y.z.z.y.A.B.f m./ ", +" $ - } ^ ^ } # > , ", +" C. { ^ ", +" . D.E. ; F.G.H.I. ", +" J.K.{ L.M.H.H.H.# ", +" N.O.[ [ P.H.H.K. ", +" [ O.Q. R.S.T.U. ", +" { K.V. W.T.I.T Q. ", +" E.D.g X.Y. g D.Z. ", +" `.S.H. + [ .+++ ", +" @+Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.#+$+H.H.O.Z.Z.%+&+*+Z.Z.Z.L.(. ", +" =+-+;+;+;+;+;+;+;+;+;+Y.>+,+H.H.'+;+++T.)+;+;+;+;+!+~+(. ", +" =+-+*+{+{+{+{+{+{+{+{+{+;+]+^+M./+(+Q.{+{+{+{+{+{+*+~+(. ", +" =+-+*+{+{+{+{+{+{+{+{+{+{+{+_+{+!+{+{+{+{+{+{+{+{+*+~+ ", +" =+:+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+[+ ", +" }+' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreateActiveMeshRBArray.xpm b/Extras/MayaPlugin/icons/dynamicaCreateActiveMeshRBArray.xpm new file mode 100644 index 000000000..cb6b9b781 --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreateActiveMeshRBArray.xpm @@ -0,0 +1,174 @@ +/* XPM */ +static char * dynamicaCreateActiveMeshRBArray_xpm[] = { +"32 32 139 2", +" c #B1B1B1", +". c #A2A2A2", +"+ c #929292", +"@ c #AFAFAF", +"# c #B0B0B0", +"$ c #ABABAB", +"% c #ACACAC", +"& c #ADADAD", +"* c #928787", +"= c #C75252", +"- c #9E7777", +"; c #8F8888", +"> c #8E8888", +", c #A4A4A4", +"' c #947777", +") c #947878", +"! c #A9A9A9", +"~ c #A0A0A0", +"{ c #948787", +"] c #AA7878", +"^ c #BB6868", +"/ c #D24A4A", +"( c #CA4141", +"_ c #C33939", +": c #BE2E2E", +"< c #996E6E", +"[ c #A5A5A5", +"} c #9E5E5E", +"| c #B62020", +"1 c #957474", +"2 c #A7A7A7", +"3 c #9C7E7E", +"4 c #AE7373", +"5 c #CB6262", +"6 c #D75757", +"7 c #D65050", +"8 c #D24141", +"9 c #CE2D2D", +"0 c #C81616", +"a c #C30000", +"b c #B32929", +"c c #B52323", +"d c #A25454", +"e c #989898", +"f c #BC5C5C", +"g c #A77474", +"h c #CC5555", +"i c #D54B4B", +"j c #C71212", +"k c #C10404", +"l c #B32828", +"m c #BE0D0D", +"n c #917F7F", +"o c #AEAEAE", +"p c #9A7B7B", +"q c #B75A5A", +"r c #CF3F3F", +"s c #CF3535", +"t c #CC2525", +"u c #C60B0B", +"v c #A84646", +"w c #9E9E9E", +"x c #9E7272", +"y c #CC2626", +"z c #C91919", +"A c #C40404", +"B c #C30101", +"C c #A35252", +"D c #8C8B8B", +"E c #8D8A8A", +"F c #B03F3F", +"G c #A35151", +"H c #9B9B9B", +"I c #A15656", +"J c #B22A2A", +"K c #B52424", +"L c #B22C2C", +"M c #A94141", +"N c #976F6F", +"O c #9C9C9C", +"P c #A3A3A3", +"Q c #979797", +"R c #969696", +"S c #9D9D9D", +"T c #937777", +"U c #898686", +"V c #797979", +"W c #9F9F9F", +"X c #0F0F0F", +"Y c #707070", +"Z c #737373", +"` c #2C2C2C", +" . c #000000", +".. c #8E8E8E", +"+. c #7F7F7F", +"@. c #080808", +"#. c #6E6E6E", +"$. c #0C0C0C", +"%. c #4F4F4F", +"&. c #212121", +"*. c #494949", +"=. c #4B4B4B", +"-. c #606060", +";. c #131313", +">. c #060606", +",. c #1D1D1D", +"'. c #7D7D7D", +"). c #858585", +"!. c #626262", +"~. c #6C6C6C", +"{. c #414141", +"]. c #454545", +"^. c #2A2A2A", +"/. c #434343", +"(. c #7C7C7C", +"_. c #5A5A5A", +":. c #121212", +"<. c #2F2F2F", +"[. c #141414", +"}. c #686868", +"|. c #818181", +"1. c #5C5C5C", +"2. c #646464", +"3. c #2D2D2D", +"4. c #050505", +"5. c #151515", +"6. c #575757", +"7. c #636363", +"8. c #555555", +"9. c #6A6A6A", +"0. c #3C3C3C", +"a. c #111111", +"b. c #666666", +"c. c #090909", +"d. c #515151", +"e. c #5B5B5B", +"f. c #5F5F5F", +"g. c #616161", +"h. c #959595", +" . + . @ # $ % ", +" & . * = - ; > . , ' ) % ", +" ! ~ { ] ^ / ( _ : < [ } | 1 $ ", +"2 3 4 5 6 7 8 9 0 a b > c d . ", +"e f g h i 8 9 j a a k l m n o . + . @ # $ % ", +"2 p q r s t u a a a a a v w & . * = - ; > . , ' ) % ", +" 2 x y z A a a a a B C D o ! ~ { ] ^ / ( _ : < [ } | 1 $ ", +" # E F a a a a a k G H 2 3 4 5 6 7 8 9 0 a b > c d . ", +" ! D I J K L M N O e f g h i 8 9 j a a k l m n o ", +" P Q R e S ! 2 p q r s t u a a a a a v w ", +" . + . @ # $ . x y z A a a a a B C D o ", +" & . * = - ; > . , ' T U F a a a a a k G H ", +" ! ~ { ] ^ / ( _ : < [ } | 1 P D I J K L M N O ", +"2 3 4 5 6 7 8 9 0 a b > c d . P Q R e S ! ", +"e f g h i 8 9 j a a k l m n o ", +"2 p q r s t u a a a a a v w ", +" 2 x y z A a a a a B C D o ", +" # E F a a a a a k G H ", +" ! D I J K L M N V R O ", +" P Q R e S W X Y $ Z ` ... ", +" +.@.R #.$. . . .. ", +" %.&.& & *. . .@. ", +" & &.=. -.;.>.,. ", +" R @.'. ).>...+ =. ", +" Y X ~ V !. ~ X ~. ", +" {.;. .]. & ^./. ", +" (.~.~.~.~.~.~.~.~.~.~.~._.:. . .&.~.~.<.[.}.~.~.~.#.! ", +" |.1.2.2.2.2.2.2.2.2.2.!.3.4. . .5.2./.>.6.2.2.2.2.7.8.! ", +" |.1.}.9.9.9.9.9.9.9.9.9.2.0.a.$.b.c.=.9.9.9.9.9.9.}.8.! ", +" |.1.}.9.9.9.9.9.9.9.9.9.9.9.d.9.7.9.9.9.9.9.9.9.9.}.8. ", +" |.e.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.g. ", +" [ h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h. "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreateActivePlaneRB.xpm b/Extras/MayaPlugin/icons/dynamicaCreateActivePlaneRB.xpm new file mode 100644 index 000000000..1fdcbed7b --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreateActivePlaneRB.xpm @@ -0,0 +1,55 @@ +/* XPM */ +static char * dynamicaCreateActivePlaneRB_xpm[] = { +"32 32 20 1", +" c #B1B1B1", +". c #958F8F", +"+ c #8F8181", +"@ c #908383", +"# c #ACACAC", +"$ c #969595", +"% c #8B7171", +"& c #C52525", +"* c #C22828", +"= c #7C7C7C", +"- c #8A7272", +"; c #DC0909", +"> c #E40000", +", c #DB0B0B", +"' c #887373", +") c #867575", +"! c #986161", +"~ c #887B7B", +"{ c #AAAAAA", +"] c #A1A1A1", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" .++++++++++++++++++++++++@# ", +" $%&&&&&&&&&&&&&&&&&&&&&&&*=# ", +" $-;>>>>>>>>>>>>>>>>>>>>>>,=# ", +" $';>>>>>>>>>>>>>>>>>>>>>>,= ", +" $)!!!!!!!!!!!!!!!!!!!!!!!!~ ", +" {]]]]]]]]]]]]]]]]]]]]]]]] ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreateActivePlaneRBArray.xpm b/Extras/MayaPlugin/icons/dynamicaCreateActivePlaneRBArray.xpm new file mode 100644 index 000000000..ca7b846cc --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreateActivePlaneRBArray.xpm @@ -0,0 +1,66 @@ +/* XPM */ +static char * dynamicaCreateActivePlaneRBArray_xpm[] = { +"32 32 31 1", +" c #B1B1B1", +". c #928787", +"+ c #8B7D7D", +"@ c #8C7E7E", +"# c #8C7D7D", +"$ c #8F8181", +"% c #969696", +"& c #8D7E7E", +"* c #AE4141", +"= c #CB1E1E", +"- c #CC1D1D", +"; c #AC4444", +"> c #8D7F7F", +", c #ADADAD", +"' c #7F7B7B", +") c #E30101", +"! c #E40000", +"~ c #946666", +"{ c #959090", +"] c #948D8D", +"^ c #9C5C5C", +"/ c #DE0707", +"( c #807B7B", +"_ c #7D7B7B", +": c #986161", +"< c #956565", +"[ c #996060", +"} c #7F7A7A", +"| c #AFAFAF", +"1 c #A1A1A1", +"2 c #A2A2A2", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" .+@@@@@@@@@@@#$% ", +" &*===========-;> ", +" ,')!!!!!!!!!!!!~{ ", +" ]^!!!!!!!!!!!!/( ", +" _:<<<<<<<<<<<[}| ", +" 1222222222221| ", +" .+@@@@@@@@@@@#$% ", +" &*===========-;> ", +" ,')!!!!!!!!!!!!~{ ", +" ]^!!!!!!!!!!!!/( ", +" _:<<<<<<<<<<<[}| ", +" 1222222222221| ", +" .+@@@@@@@@@@@#$% ", +" &*===========-;> ", +" ,')!!!!!!!!!!!!~{ ", +" ]^!!!!!!!!!!!!/( ", +" _:<<<<<<<<<<<[}| ", +" 1222222222221| ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreateActiveRB.xpm b/Extras/MayaPlugin/icons/dynamicaCreateActiveRB.xpm new file mode 100644 index 000000000..379f2f0eb --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreateActiveRB.xpm @@ -0,0 +1,37 @@ +/* XPM */ +static char * dynamicaCreateActiveRB_xpm[] = { +"32 32 2 1", +" c None", +". c #4E36E0", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................"}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreateActiveSphereRB.xpm b/Extras/MayaPlugin/icons/dynamicaCreateActiveSphereRB.xpm new file mode 100644 index 000000000..701ff3c39 --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreateActiveSphereRB.xpm @@ -0,0 +1,229 @@ +/* XPM */ +static char * dynamicaCreateActiveSphereRB_xpm[] = { +"32 32 194 2", +" c #B1B1B1", +". c #B2AFAF", +"+ c #BAA2A2", +"@ c #BD9C9C", +"# c #BC9A9A", +"$ c #BB9696", +"% c #B69E9E", +"& c #B5ACAC", +"* c #C69696", +"= c #D18686", +"- c #D18181", +"; c #CF7E7E", +"> c #CC7777", +", c #C96D6D", +"' c #C46161", +") c #BE5A5A", +"! c #B57878", +"~ c #B1ABAB", +"{ c #BEA2A2", +"] c #D28989", +"^ c #D38787", +"/ c #D28484", +"( c #CE7C7C", +"_ c #CB7474", +": c #C76969", +"< c #C25A5A", +"[ c #BB4848", +"} c #B43434", +"| c #AC2D2D", +"1 c #AE8D8D", +"2 c #C19E9E", +"3 c #D38888", +"4 c #D08080", +"5 c #CE7A7A", +"6 c #CA7070", +"7 c #C56363", +"8 c #BE5151", +"9 c #B63B3B", +"0 c #AE2323", +"a c #A40A0A", +"b c #A20707", +"c c #AD8686", +"d c #BAA6A6", +"e c #D48989", +"f c #D28686", +"g c #D18383", +"h c #CC7676", +"i c #C86A6A", +"j c #C25B5B", +"k c #BA4545", +"l c #B02A2A", +"m c #A60E0E", +"n c #A10101", +"o c #A20F0F", +"p c #AF9E9E", +"q c #CE8E8E", +"r c #C96E6E", +"s c #BE4F4F", +"t c #B43535", +"u c #A81414", +"v c #A74343", +"w c #BDA2A2", +"x c #CB7272", +"y c #C56262", +"z c #BF5353", +"A c #B73E3E", +"B c #AC1F1F", +"C c #A10303", +"D c #AF9C9C", +"E c #C89494", +"F c #CF7D7D", +"G c #C66565", +"H c #B73D3D", +"I c #AE2525", +"J c #AA6666", +"K c #CC8989", +"L c #D18282", +"M c #C76767", +"N c #BE5050", +"O c #AC1E1E", +"P c #A20404", +"Q c #A74545", +"R c #CF8282", +"S c #C15858", +"T c #B73C3C", +"U c #AB1B1B", +"V c #A20505", +"W c #A63535", +"X c #CC7F7F", +"Y c #C35D5D", +"Z c #BC4A4A", +"` c #B02B2B", +" . c #A63939", +".. c #C87F7F", +"+. c #C86C6C", +"@. c #BD4C4C", +"#. c #A71111", +"$. c #A84949", +"%. c #BF8888", +"&. c #C45F5F", +"*. c #C05656", +"=. c #A91717", +"-. c #AB7373", +";. c #B69C9C", +">. c #BA4444", +",. c #B33232", +"'. c #AA1919", +"). c #A20909", +"!. c #B0A9A9", +"~. c #BA6767", +"{. c #B84040", +"]. c #B23030", +"^. c #A95A5A", +"/. c #B29F9F", +"(. c #B23636", +"_. c #A20303", +":. c #A42222", +"<. c #B0ABAB", +"[. c #AF8C8C", +"}. c #A40E0E", +"|. c #A31A1A", +"1. c #AE9292", +"2. c #A41E1E", +"3. c #B0A5A5", +"4. c #B1AFAF", +"5. c #AB6B6B", +"6. c #A52C2C", +"7. c #7D0101", +"8. c #A63737", +"9. c #AD8383", +"0. c #969696", +"a. c #9C9C9C", +"b. c #A48686", +"c. c #0E0C0C", +"d. c #6F5B5B", +"e. c #ABABAB", +"f. c #737373", +"g. c #2C2C2C", +"h. c #000000", +"i. c #8E8E8E", +"j. c #7F7F7F", +"k. c #080808", +"l. c #6E6E6E", +"m. c #0C0C0C", +"n. c #A2A2A2", +"o. c #4F4F4F", +"p. c #212121", +"q. c #ADADAD", +"r. c #494949", +"s. c #4B4B4B", +"t. c #606060", +"u. c #131313", +"v. c #060606", +"w. c #1D1D1D", +"x. c #7D7D7D", +"y. c #858585", +"z. c #929292", +"A. c #707070", +"B. c #0F0F0F", +"C. c #A0A0A0", +"D. c #797979", +"E. c #626262", +"F. c #6C6C6C", +"G. c #414141", +"H. c #454545", +"I. c #2A2A2A", +"J. c #434343", +"K. c #7C7C7C", +"L. c #5A5A5A", +"M. c #121212", +"N. c #2F2F2F", +"O. c #141414", +"P. c #686868", +"Q. c #A9A9A9", +"R. c #818181", +"S. c #5C5C5C", +"T. c #646464", +"U. c #2D2D2D", +"V. c #050505", +"W. c #151515", +"X. c #575757", +"Y. c #636363", +"Z. c #555555", +"`. c #6A6A6A", +" + c #3C3C3C", +".+ c #111111", +"++ c #666666", +"@+ c #090909", +"#+ c #515151", +"$+ c #5B5B5B", +"%+ c #5F5F5F", +"&+ c #616161", +"*+ c #A5A5A5", +"=+ c #959595", +" . + @ # $ % ", +" & * = - ; > , ' ) ! ~ ", +" { ] ^ / - ( _ : < [ } | 1 ", +" 2 3 3 ^ / 4 5 6 7 8 9 0 a b c ", +" d e 3 3 f g ; h i j k l m n n o p ", +" q 3 3 ^ / 4 5 r ' s t u n n n n v ", +" w 3 ^ ^ / - ( x y z A B n n n n n C D ", +" E f f / - F _ G s H I n n n n n n n J ", +" K g L 4 ( _ M N } O P n n n n n n n Q ", +" R 4 ; 5 _ : S T U V n n n n n n n n W ", +" X 5 > x i Y Z ` a n n n n n n n n n . ", +" ..x +.G j @.t #.n n n n n n n n n n $. ", +" %.M &.*.[ } =.n n n n n n n n n n n -. ", +" ;.j 8 >.,.'.n n n n n n n n n n n ).!. ", +" ~.{.].U n n n n n n n n n n n n ^. ", +" /.(.U _.n n n n n n n n n n n :.<. ", +" [.}.n n n n n n n n n n n |.p ", +" 1.2.n n n n n n n n n W 3. ", +" 4.5.6.n n 7.n b 8.9. 0.a. ", +" <.b.c.d. e.f.g.h.i. ", +" j.k.0. l.m.h.h.h.n. ", +" o.p.q. q.r.h.h.k. ", +" q.p.s. t.u.v.w. ", +" 0.k.x. y.v.i.z.s. ", +" A.B.C.D.E. C.B.F. ", +" G.u.h.H. q.I.J. ", +" K.F.F.F.F.F.F.F.F.F.F.F.L.M.h.h.p.F.F.N.O.P.F.F.F.l.Q. ", +" R.S.T.T.T.T.T.T.T.T.T.E.U.V.h.h.W.T.J.v.X.T.T.T.T.Y.Z.Q. ", +" R.S.P.`.`.`.`.`.`.`.`.`.T. +.+m.++@+s.`.`.`.`.`.`.P.Z.Q. ", +" R.S.P.`.`.`.`.`.`.`.`.`.`.`.#+`.Y.`.`.`.`.`.`.`.`.P.Z. ", +" R.$+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+%+&+ ", +" *+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreateActiveSphereRBArray.xpm b/Extras/MayaPlugin/icons/dynamicaCreateActiveSphereRBArray.xpm new file mode 100644 index 000000000..53e28eec5 --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreateActiveSphereRBArray.xpm @@ -0,0 +1,134 @@ +/* XPM */ +static char * dynamicaCreateActiveSphereRBArray_xpm[] = { +"32 32 99 2", +" c #B1B1B1", +". c #B69C9C", +"+ c #B99292", +"@ c #BE7B7B", +"# c #D13232", +"$ c #D81515", +"% c #D51F1F", +"& c #D61B1B", +"* c #C46464", +"= c #BB8989", +"- c #D90F0F", +"; c #BD7F7F", +"> c #B89696", +", c #C56262", +"' c #CD4141", +") c #C17070", +"! c #B79898", +"~ c #DC0202", +"{ c #B2AFAF", +"] c #DB0808", +"^ c #B3A9A9", +"/ c #B5A2A2", +"( c #D71717", +"_ c #B79A9A", +": c #C85555", +"< c #C65C5C", +"[ c #BD8181", +"} c #D13030", +"| c #B69E9E", +"1 c #B4A5A5", +"2 c #C26E6E", +"3 c #DA0A0A", +"4 c #BF7979", +"5 c #DA0C0C", +"6 c #CC4343", +"7 c #BA8C8C", +"8 c #898989", +"9 c #969696", +"0 c #9C9C9C", +"a c #A7A7A7", +"b c #0F0F0F", +"c c #707070", +"d c #ABABAB", +"e c #737373", +"f c #2C2C2C", +"g c #000000", +"h c #8E8E8E", +"i c #7F7F7F", +"j c #080808", +"k c #6E6E6E", +"l c #0C0C0C", +"m c #A2A2A2", +"n c #4F4F4F", +"o c #212121", +"p c #ADADAD", +"q c #494949", +"r c #4B4B4B", +"s c #606060", +"t c #131313", +"u c #060606", +"v c #1D1D1D", +"w c #7D7D7D", +"x c #858585", +"y c #929292", +"z c #A0A0A0", +"A c #797979", +"B c #626262", +"C c #6C6C6C", +"D c #414141", +"E c #454545", +"F c #2A2A2A", +"G c #434343", +"H c #7C7C7C", +"I c #5A5A5A", +"J c #121212", +"K c #2F2F2F", +"L c #141414", +"M c #686868", +"N c #A9A9A9", +"O c #818181", +"P c #5C5C5C", +"Q c #646464", +"R c #2D2D2D", +"S c #050505", +"T c #151515", +"U c #575757", +"V c #636363", +"W c #555555", +"X c #6A6A6A", +"Y c #3C3C3C", +"Z c #111111", +"` c #666666", +" . c #090909", +".. c #515151", +"+. c #5B5B5B", +"@. c #5F5F5F", +"#. c #616161", +"$. c #A5A5A5", +"%. c #959595", +" ", +" . + . + ", +" @ # $ % & * @ # $ % & * ", +" = - ; > % , = - ; > % , ", +" ' ) ! ~ { ' ) ! ~ { ", +" ] ^ % + ] ^ % + ", +" - / ( _ - / ( _ ", +" : < [ } : < [ } ", +" | ~ : . 1 2 3 4 | ~ : . 1 2 3 4 ", +" 1 < $ 5 6 7 1 < $ 5 6 7 ", +" . + . + ", +" @ # $ % & * @ # $ % & * ", +" = - ; > % , = - ; > % , ", +" ' ) ! ~ { ' ) ! ~ { ", +" ] ^ % + ] ^ % + ", +" - / ( _ - / ( _ ", +" : < [ } : < [ } ", +" | ~ : . 1 2 3 4 | ~ : . 1 2 3 4 ", +" 1 < $ 5 6 7 8 1 < $ 5 6 7 9 0 ", +" a b c d e f g h ", +" i j 9 k l g g g m ", +" n o p p q g g j ", +" p o r s t u v ", +" 9 j w x u h y r ", +" c b z A B z b C ", +" D t g E p F G ", +" H C C C C C C C C C C C I J g g o C C K L M C C C k N ", +" O P Q Q Q Q Q Q Q Q Q B R S g g T Q G u U Q Q Q Q V W N ", +" O P M X X X X X X X X X Q Y Z l ` .r X X X X X X M W N ", +" O P M X X X X X X X X X X X ..X V X X X X X X X X M W ", +" O +.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.#. ", +" $.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%. "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreatePassiveBoxRB.xpm b/Extras/MayaPlugin/icons/dynamicaCreatePassiveBoxRB.xpm new file mode 100644 index 000000000..24aa70a35 --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreatePassiveBoxRB.xpm @@ -0,0 +1,112 @@ +/* XPM */ +static char * dynamicaCreatePassiveBoxRB_xpm[] = { +"32 32 77 1", +" c #B1B1B1", +". c #B0B0B0", +"+ c #979797", +"@ c #808080", +"# c #949494", +"$ c #595959", +"% c #7A7A7A", +"& c #747474", +"* c #939393", +"= c #575757", +"- c #7B7B7B", +"; c #888888", +"> c #A2A2A2", +", c #848484", +"' c #5F5F5F", +") c #323232", +"! c #313131", +"~ c #373737", +"{ c #444444", +"] c #9E9E9E", +"^ c #656565", +"/ c #3D3D3D", +"( c #343434", +"_ c #454545", +": c #4C4C4C", +"< c #303030", +"[ c #2B2B2B", +"} c #202020", +"| c #2C2C2C", +"1 c #4A4A4A", +"2 c #8A8A8A", +"3 c #8C8C8C", +"4 c #ADADAD", +"5 c #434343", +"6 c #262626", +"7 c #797979", +"8 c #4D4D4D", +"9 c #868686", +"0 c #565656", +"a c #101010", +"b c #000000", +"c c #505050", +"d c #020202", +"e c #0E0E0E", +"f c #828282", +"g c #AFAFAF", +"h c #555555", +"i c #161616", +"j c #989898", +"k c #515151", +"l c #0C0C0C", +"m c #686868", +"n c #585858", +"o c #090909", +"p c #060606", +"q c #636363", +"r c #2E2E2E", +"s c #181818", +"t c #909090", +"u c #535353", +"v c #171717", +"w c #6B6B6B", +"x c #919191", +"y c #5E5E5E", +"z c #424242", +"A c #6E6E6E", +"B c #858585", +"C c #4F4F4F", +"D c #080808", +"E c #414141", +"F c #242424", +"G c #1A1A1A", +"H c #3F3F3F", +"I c #9C9C9C", +"J c #666666", +"K c #A5A5A5", +"L c #878787", +" ", +" ", +" ", +" ", +" ", +" . ", +" +@@@@@@@@@@@@@@# ", +" +$%&&&&&&&&&&&&&* ", +" +=$-&&&&&&&&&&&&&* ", +" +==$-&&&&&&&&&&&&&* ", +" +===$;;;;;;;;;;;;;;. ", +" +====;;;;;;;;;;;;;; ", +" +====;;;;;;;;;;;;;; ", +" >,')!~{@;;;;;;;;;;;;; ", +" ]^/(_: c #343434", +", c #454545", +"' c #595959", +") c #626262", +"! c #575757", +"~ c #414141", +"{ c #3A3A3A", +"] c #606060", +"^ c #A0A0A0", +"/ c #8A8A8A", +"( c #8C8C8C", +"_ c #ADADAD", +": c #424242", +"< c #262626", +"[ c #161616", +"} c #646464", +"| c #4D4D4D", +"1 c #141414", +"2 c #000000", +"3 c #686868", +"4 c #323232", +"5 c #010101", +"6 c #080808", +"7 c #4A4A4A", +"8 c #7B7B7B", +"9 c #AFAFAF", +"0 c #6E6E6E", +"a c #0D0D0D", +"b c #989898", +"c c #515151", +"d c #0C0C0C", +"e c #676767", +"f c #050505", +"g c #818181", +"h c #2E2E2E", +"i c #181818", +"j c #2F2F2F", +"k c #1D1D1D", +"l c #696969", +"m c #0E0E0E", +"n c #808080", +"o c #383838", +"p c #555555", +"q c #909090", +"r c #979797", +"s c #020202", +"t c #1F1F1F", +"u c #0F0F0F", +"v c #525252", +"w c #9C9C9C", +"x c #A5A5A5", +"y c #4C4C4C", +"z c #B0B0B0", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ....... ....... ", +" . . . . ", +" . . . . ", +" . . . . ", +" +@#$%#&* . . . ", +" =-;>,')%!~{]^. . . ", +" /!(_ ...:<[,}|...... ", +" #123 ", +" .....45267..... _89", +" . 0a22! . bcd3 ", +" . .ef6= . gh22i9 ", +" . . jkl . (m22n ", +" . . .8opq_.re6s~ ", +" . . . ^]jtujvw$x ", +" ....... ......yz ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreatePassiveHullRB.xpm b/Extras/MayaPlugin/icons/dynamicaCreatePassiveHullRB.xpm new file mode 100644 index 000000000..14e2dce47 --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreatePassiveHullRB.xpm @@ -0,0 +1,159 @@ +/* XPM */ +static char * dynamicaCreatePassiveHullRB_xpm[] = { +"32 32 124 2", +" c #B1B1B1", +". c #9D9D9D", +"+ c #989898", +"@ c #A4A4A4", +"# c #ABABAB", +"$ c #838383", +"% c #565656", +"& c #5D5D5D", +"* c #575757", +"= c #525252", +"- c #636363", +"; c #6E6E6E", +"> c #797979", +", c #8B8B8B", +"' c #979797", +") c #A2A2A2", +"! c #A9A9A9", +"~ c #7C7C7C", +"{ c #5A5A5A", +"] c #747474", +"^ c #727272", +"/ c #B3B3B3", +"( c #919191", +"_ c #8C8C8C", +": c #939393", +"< c #888888", +"[ c #787878", +"} c #696969", +"| c #5E5E5E", +"1 c #626262", +"2 c #6D6D6D", +"3 c #8F8F8F", +"4 c #959595", +"5 c #ACACAC", +"6 c #A7A7A7", +"7 c #7A7A7A", +"8 c #595959", +"9 c #ADADAD", +"0 c #828282", +"a c #AFAFAF", +"b c #C2C2C2", +"c c #858585", +"d c #8E8E8E", +"e c #A8A8A8", +"f c #9F9F9F", +"g c #949494", +"h c #606060", +"i c #A5A5A5", +"j c #808080", +"k c #818181", +"l c #BBBBBB", +"m c #AAAAAA", +"n c #8D8D8D", +"o c #C0C0C0", +"p c #5F5F5F", +"q c #848484", +"r c #9B9B9B", +"s c #9C9C9C", +"t c #B0B0B0", +"u c #BCBCBC", +"v c #868686", +"w c #5C5C5C", +"x c #767676", +"y c #969696", +"z c #B6B6B6", +"A c #C1C1C1", +"B c #B5B5B5", +"C c #7F7F7F", +"D c #707070", +"E c #7B7B7B", +"F c #B7B7B7", +"G c #8A8A8A", +"H c #9E9E9E", +"I c #444444", +"J c #1F1F1F", +"K c #383838", +"L c #2E2E2E", +"M c #414141", +"N c #6B6B6B", +"O c #484848", +"P c #3F3F3F", +"Q c #6A6A6A", +"R c #999999", +"S c #646464", +"T c #7E7E7E", +"U c #4F4F4F", +"V c #4A4A4A", +"W c #373737", +"X c #545454", +"Y c #161616", +"Z c #000000", +"` c #6C6C6C", +" . c #7D7D7D", +".. c #BFBFBF", +"+. c #030303", +"@. c #151515", +"#. c #B9B9B9", +"$. c #BDBDBD", +"%. c #585858", +"&. c #A3A3A3", +"*. c #202020", +"=. c #B4B4B4", +"-. c #515151", +";. c #0C0C0C", +">. c #686868", +",. c #717171", +"'. c #080808", +"). c #BABABA", +"!. c #A0A0A0", +"~. c #181818", +"{. c #737373", +"]. c #0E0E0E", +"^. c #676767", +"/. c #323232", +"(. c #363636", +"_. c #474747", +":. c #020202", +"<. c #666666", +"[. c #909090", +"}. c #5B5B5B", +"|. c #555555", +"1. c #292929", +"2. c #212121", +"3. c #2F2F2F", +" ", +" ", +" ", +" ", +" ", +" ", +" . + @ ", +" # $ % & * = - ; > , ' ) ", +" ! ~ { ] ^ ! / ( _ : < [ } | = 1 2 [ , 3 4 5 ", +" 6 7 8 7 6 9 0 a b , 0 $ c < d e f g 7 h | * & 5 ", +" i [ { j @ ( k [ < a b l a 9 m e f n f ~ / o p ; 5 ", +" a & q r 4 > s t u b b b b b b b b b v r c # b k w 5 ", +" @ { x < y z b b b b b b b b b b b b t k # 7 A B | d ", +" ( | e C } D ; E + F b b b b b b b b b G n r b _ { a ", +" H I J K L M N ; p O P Q a b b b b b b b / R A b S T ", +" G U V + 0 : b b b b i p W 9 ; o b b b b b b b m X 5 ", +" 7 1 t a b b b b b b E Y Z ^ b b b b b b b Q ` ", +" t { ...b b b b b b E +.Z @.#.b b b b $.E %.i 9 E a ", +" $ Q &.b b b b b b > *.Z Z h b b b =.; 8 ) + -.;.>. ", +" e * < b b b b b b b b ,.;.'.9 b ).D %.!.k L Z Z ~.a ", +" ^ D R b b b b b b b b x *.{.).{.* H _ ].Z Z j ", +" f ^.{ {. b b b b b b b j /.(._.R ' ^.'.:.M ", +" s <.% x + [.G C ^ ^.}.|.L 1.J 2.3.= s <.i ", +" s } = | 1 N ] 0 g H a 5 t ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreatePassiveHullRBArray.xpm b/Extras/MayaPlugin/icons/dynamicaCreatePassiveHullRBArray.xpm new file mode 100644 index 000000000..ac98065f7 --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreatePassiveHullRBArray.xpm @@ -0,0 +1,125 @@ +/* XPM */ +static char * dynamicaCreatePassiveHullRBArray_xpm[] = { +"32 32 90 1", +" c #B1B1B1", +". c #ADADAD", +"+ c #878787", +"@ c #707070", +"# c #797979", +"$ c #838383", +"% c #909090", +"& c #9C9C9C", +"* c #A6A6A6", +"= c #ABABAB", +"- c #6D6D6D", +"; c #818181", +"> c #A0A0A0", +", c #858585", +"' c #787878", +") c #737373", +"! c #747474", +"~ c #777777", +"{ c #7D7D7D", +"] c #979797", +"^ c #6E6E6E", +"/ c #848484", +"( c #A8A8A8", +"_ c #ACACAC", +": c #989898", +"< c #646464", +"[ c #727272", +"} c #9D9D9D", +"| c #8E8E8E", +"1 c #9E9E9E", +"2 c #959595", +"3 c #7B7B7B", +"4 c #808080", +"5 c #828282", +"6 c #AFAFAF", +"7 c #9B9B9B", +"8 c #666666", +"9 c #656565", +"0 c #8B8B8B", +"a c #A7A7A7", +"b c #8D8D8D", +"c c #717171", +"d c #2F2F2F", +"e c #232323", +"f c #424242", +"g c #595959", +"h c #626262", +"i c #575757", +"j c #414141", +"k c #2E2E2E", +"l c #3C3C3C", +"m c #8A8A8A", +"n c #919191", +"o c #888888", +"p c #7F7F7F", +"q c #5F5F5F", +"r c #535353", +"s c #323232", +"t c #545454", +"u c #7A7A7A", +"v c #141414", +"w c #000000", +"x c #A9A9A9", +"y c #020202", +"z c #0F0F0F", +"A c #484848", +"B c #AAAAAA", +"C c #515151", +"D c #0C0C0C", +"E c #686868", +"F c #3B3B3B", +"G c #0B0B0B", +"H c #080808", +"I c #181818", +"J c #6C6C6C", +"K c #1D1D1D", +"L c #696969", +"M c #8C8C8C", +"N c #0E0E0E", +"O c #383838", +"P c #555555", +"Q c #676767", +"R c #606060", +"S c #1F1F1F", +"T c #212121", +"U c #525252", +"V c #A5A5A5", +"W c #B0B0B0", +"X c #898989", +"Y c #AEAEAE", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" .+@#$%&*= ", +" =+-;>&%,')!~{ ", +" ]^/( _:< ", +" [} /| .+@#$%&*= ", +" @1 =^==+-;>&%,')!~{ ", +" 23 45]^/( _:< ", +" 6@7/@89@0abc.[} /| ", +" 19defgh&%,')Avwwf-5nop)@B:CDE ", +" ]^/( _:FGH1 ;kwwI6 ", +" [} /|JKL MNww4 ", +" @1 =^= 3OP%. ]QHyj ", +" 23 45 >RdSTdU&8V ", +" 6@x bc. _W ", +" X'x |^_ ", +" Y,-5nop)@B ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreatePassiveMeshRB.xpm b/Extras/MayaPlugin/icons/dynamicaCreatePassiveMeshRB.xpm new file mode 100644 index 000000000..d47cc35f5 --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreatePassiveMeshRB.xpm @@ -0,0 +1,152 @@ +/* XPM */ +static char * dynamicaCreatePassiveMeshRB_xpm[] = { +"32 32 117 2", +" c #B1B1B1", +". c #A5A5A5", +"+ c #929292", +"@ c #8C8C8C", +"# c #9F9F9F", +"$ c #AEAEAE", +"% c #858585", +"& c #9B9B9B", +"* c #9E9E9E", +"= c #8E8E8E", +"- c #A0A0A0", +"; c #AAAAAA", +"> c #A6A6A6", +", c #ADADAD", +"' c #8F8F8F", +") c #919191", +"! c #979797", +"~ c #838383", +"{ c #868686", +"] c #848484", +"^ c #ACACAC", +"/ c #999999", +"( c #8D8D8D", +"_ c #949494", +": c #969696", +"< c #A3A3A3", +"[ c #AFAFAF", +"} c #9C9C9C", +"| c #A1A1A1", +"1 c #A7A7A7", +"2 c #A9A9A9", +"3 c #959595", +"4 c #888888", +"5 c #909090", +"6 c #9D9D9D", +"7 c #9A9A9A", +"8 c #8B8B8B", +"9 c #A8A8A8", +"0 c #727272", +"a c #616161", +"b c #606060", +"c c #5E5E5E", +"d c #696969", +"e c #7F7F7F", +"f c #989898", +"g c #878787", +"h c #898989", +"i c #7B7B7B", +"j c #565656", +"k c #313131", +"l c #2D2D2D", +"m c #343434", +"n c #444444", +"o c #595959", +"p c #5B5B5B", +"q c #4E4E4E", +"r c #3A3A3A", +"s c #515151", +"t c #7A7A7A", +"u c #6C6C6C", +"v c #7C7C7C", +"w c #8A8A8A", +"x c #6B6B6B", +"y c #464646", +"z c #282828", +"A c #828282", +"B c #B0B0B0", +"C c #585858", +"D c #101010", +"E c #000000", +"F c #808080", +"G c #787878", +"H c #6F6F6F", +"I c #636363", +"J c #505050", +"K c #4C4C4C", +"L c #545454", +"M c #020202", +"N c #0D0D0D", +"O c #656565", +"P c #4B4B4B", +"Q c #6D6D6D", +"R c #797979", +"S c #767676", +"T c #757575", +"U c #494949", +"V c #131313", +"W c #4F4F4F", +"X c #555555", +"Y c #0C0C0C", +"Z c #686868", +"` c #6A6A6A", +" . c #676767", +".. c #646464", +"+. c #626262", +"@. c #050505", +"#. c #030303", +"$. c #434343", +"%. c #818181", +"&. c #2E2E2E", +"*. c #181818", +"=. c #777777", +"-. c #5D5D5D", +";. c #525252", +">. c #2C2C2C", +",. c #0E0E0E", +"'. c #393939", +"). c #202020", +"!. c #3D3D3D", +"~. c #7E7E7E", +"{. c #080808", +"]. c #414141", +"^. c #6E6E6E", +"/. c #666666", +"(. c #2F2F2F", +"_. c #1F1F1F", +":. c #212121", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" . + @ # ", +" $ % & * = - ; > , ", +" $ = # . @ = ' ) + ! ; * ~ { { ] , ", +" ^ / ( % ( # . # / ! _ + = : < { + ' % ~ $ ", +" [ . } { ! | 1 2 > < | # } / ! 3 4 | ) + 5 ] ! $ ", +" 6 ] @ _ < 2 2 1 . | # } & 7 ! 3 _ ) = , % 5 % 8 ", +" 9 4 ' 0 a b c d e : & f ! : 3 _ + + + g : h ~ i & ", +" * j k l m n o p q r k s ] ) 5 5 ' = = @ 4 ~ t u v 1 ", +" w s x ) g @ & 7 f 3 i y z v q 4 4 % A i 0 d b c A B ", +" : g @ ( ) ) 5 ' @ w C D E q F G H I C J K 0 6 ", +" # ~ { { g 4 g % ] L M E N u O C P P q Q : , i [ ", +" 3 e i t R G S T U V E E l W P P X v / f s Y Z ", +" < e 0 Q ` ...+.a c m @.#.$.P J v * %.&.E E *.[ ", +" : =.+.-.C L ;.W P P &.Y >.s R 7 @ ,.E E F ", +" , : G -.q P P P P P P '.).!.~., ! .{.M ]. ", +" * F ^./.I I /.u T e h -.(._.:.(.;.} /.. ", +" $ - / ! ! / * > $ ^ B ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreatePassiveMeshRBArray.xpm b/Extras/MayaPlugin/icons/dynamicaCreatePassiveMeshRBArray.xpm new file mode 100644 index 000000000..e645432d2 --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreatePassiveMeshRBArray.xpm @@ -0,0 +1,128 @@ +/* XPM */ +static char * dynamicaCreatePassiveMeshRBArray_xpm[] = { +"32 32 93 2", +" c #B1B1B1", +". c #898989", +"+ c #616161", +"@ c #ACACAC", +"# c #AEAEAE", +"$ c #A3A3A3", +"% c #A7A7A7", +"& c #8A8A8A", +"* c #525252", +"= c #656565", +"- c #565656", +"; c #515151", +"> c #8E8E8E", +", c #545454", +"' c #9C9C9C", +") c #868686", +"! c #535353", +"~ c #5A5A5A", +"{ c #606060", +"] c #686868", +"^ c #676767", +"/ c #646464", +"( c #909090", +"_ c #585858", +": c #636363", +"< c #A0A0A0", +"[ c #989898", +"} c #555555", +"| c #5B5B5B", +"1 c #696969", +"2 c #626262", +"3 c #707070", +"4 c #595959", +"5 c #666666", +"6 c #A8A8A8", +"7 c #5D5D5D", +"8 c #808080", +"9 c #979797", +"0 c #575757", +"a c #505050", +"b c #AFAFAF", +"c c #5F5F5F", +"d c #787878", +"e c #A2A2A2", +"f c #848484", +"g c #2D2D2D", +"h c #393939", +"i c #4C4C4C", +"j c #7B7B7B", +"k c #B0B0B0", +"l c #9E9E9E", +"m c #3D3D3D", +"n c #343434", +"o c #454545", +"p c #444444", +"q c #282828", +"r c #222222", +"s c #3C3C3C", +"t c #717171", +"u c #9D9D9D", +"v c #8C8C8C", +"w c #ADADAD", +"x c #323232", +"y c #878787", +"z c #303030", +"A c #0D0D0D", +"B c #000000", +"C c #020202", +"D c #090909", +"E c #6E6E6E", +"F c #171717", +"G c #4D4D4D", +"H c #0C0C0C", +"I c #3A3A3A", +"J c #030303", +"K c #040404", +"L c #5E5E5E", +"M c #424242", +"N c #1F1F1F", +"O c #181818", +"P c #4B4B4B", +"Q c #353535", +"R c #0E0E0E", +"S c #2C2C2C", +"T c #6B6B6B", +"U c #7D7D7D", +"V c #080808", +"W c #414141", +"X c #2F2F2F", +"Y c #212121", +"Z c #A5A5A5", +"` c #8B8B8B", +" . c #6D6D6D", +" ", +" ", +" ", +" ", +" ", +" . + . @ # $ $ ", +" % & * = - ; ; & > , , $ ", +" ' ) ! ~ { ] ^ = / - ( _ : , < ", +" [ } | = 1 1 1 1 1 1 2 ; : ~ & ", +" 3 + 4 5 1 1 1 1 1 1 ] 2 ^ * 6 ", +" [ } { ] 1 1 1 1 1 1 1 1 7 8 ", +" 9 0 1 1 1 1 1 1 1 1 ~ a 6 ", +" b a c 1 1 1 1 1 ] ~ d . + . @ # $ $ ", +" e f 3 | g h i 7 + 7 } j k % & * = - ; ; & > , , $ ", +" l = m n o 4 2 / p q r s t u ' ) ! ~ { ] ^ = / - ( _ : , < ", +" & 0 v w 9 0 x y z ~ = 1 1 1 1 1 1 2 ; : ~ & ", +" 3 A B n 5 1 1 1 1 1 1 ] 2 ^ * 6 ", +" . + . @ # 3 C B D : 1 1 1 1 1 1 1 1 7 8 w j b ", +" % & * = - ; ; & E F B B z 1 1 1 1 1 1 1 ~ o G H ] ", +" ' ) ! ~ { ] ^ = / - ( _ I J K L 1 1 1 1 ] M N B B O b ", +" [ } | = 1 1 1 1 1 1 2 ; : ~ P A Q + : + 7 } + R B B 8 ", +" 3 + 4 5 1 1 1 1 1 1 ] 2 ^ * 6 j S Q } T U ) ^ V C W ", +" [ } { ] 1 1 1 1 1 1 1 1 7 8 < { X N Y X * ' 5 Z ", +" 9 0 1 1 1 1 1 1 1 1 ~ a 6 @ k ", +" b a c 1 1 1 1 1 ] ~ d ", +" u a ~ + : + 7 } j k ", +" ` .1 E U u ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreatePassivePlaneRB.xpm b/Extras/MayaPlugin/icons/dynamicaCreatePassivePlaneRB.xpm new file mode 100644 index 000000000..efa4f18e2 --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreatePassivePlaneRB.xpm @@ -0,0 +1,108 @@ +/* XPM */ +static char * dynamicaCreatePassivePlaneRB_xpm[] = { +"32 32 73 1", +" c #B1B1B1", +". c #A2A2A2", +"+ c #848484", +"@ c #707070", +"# c #666666", +"$ c #656565", +"% c #8B8B8B", +"& c #A7A7A7", +"* c #9E9E9E", +"= c #3D3D3D", +"- c #343434", +"; c #454545", +"> c #595959", +", c #626262", +"' c #646464", +") c #575757", +"! c #414141", +"~ c #3A3A3A", +"{ c #606060", +"] c #A0A0A0", +"^ c #8A8A8A", +"/ c #8C8C8C", +"( c #ADADAD", +"_ c #979797", +": c #323232", +"< c #AFAFAF", +"[ c #7C7C7C", +"} c #6C6C6C", +"| c #0C0C0C", +"1 c #000000", +"2 c #404040", +"3 c #6E6E6E", +"4 c #A9A9A9", +"5 c #818181", +"6 c #5C5C5C", +"7 c #010101", +"8 c #0B0B0B", +"9 c #5F5F5F", +"0 c #636363", +"a c #555555", +"b c #7B7B7B", +"c c #686868", +"d c #6A6A6A", +"e c #424242", +"f c #111111", +"g c #272727", +"h c #3E3E3E", +"i c #070707", +"j c #050505", +"k c #4D4D4D", +"l c #1B1B1B", +"m c #5B5B5B", +"n c #0F0F0F", +"o c #383838", +"p c #4B4B4B", +"q c #616161", +"r c #A5A5A5", +"s c #959595", +"t c #676767", +"u c #2F2F2F", +"v c #484848", +"w c #797979", +"x c #919191", +"y c #7F7F7F", +"z c #565656", +"A c #020202", +"B c #363636", +"C c #1F1F1F", +"D c #212121", +"E c #525252", +"F c #9C9C9C", +"G c #ACACAC", +"H c #B0B0B0", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" .+@#$@%& ", +" *$=-;>,')!~{] ", +" ^)/( _):*'< ", +" [}}}}}}}}}}}};|12}}}}}}}}34 ", +" 56'''''''''''27189'''''''0a4(b<", +" 56cdddddddddef11-dddddddd>g|c ", +" 56cddddddddddhij9dddddkl11|< ", +" 5m99999999999~no99999pi11;q ", +" rsssssssssssstuvwxsyziABs ", +" ]{uCDuEF#r ", +" GH ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreatePassivePlaneRBArray.xpm b/Extras/MayaPlugin/icons/dynamicaCreatePassivePlaneRBArray.xpm new file mode 100644 index 000000000..5ab692e26 --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreatePassivePlaneRBArray.xpm @@ -0,0 +1,117 @@ +/* XPM */ +static char * dynamicaCreatePassivePlaneRBArray_xpm[] = { +"32 32 82 1", +" c #B1B1B1", +". c #6E6E6E", +"+ c #5F5F5F", +"@ c #616161", +"# c #606060", +"$ c #666666", +"% c #7E7E7E", +"& c #626262", +"* c #6D6D6D", +"= c #636363", +"- c #A9A9A9", +"; c #4E4E4E", +"> c #767676", +", c #777777", +"' c #5B5B5B", +") c #787878", +"! c #757575", +"~ c #5E5E5E", +"{ c #747474", +"] c #505050", +"^ c #4D4D4D", +"/ c #5C5C5C", +"( c #5D5D5D", +"_ c #4F4F4F", +": c #ADADAD", +"< c #868686", +"[ c #6F6F6F", +"} c #565656", +"| c #555555", +"1 c #8C8C8C", +"2 c #959595", +"3 c #929292", +"4 c #9E9E9E", +"5 c #656565", +"6 c #3D3D3D", +"7 c #343434", +"8 c #454545", +"9 c #595959", +"0 c #646464", +"a c #575757", +"b c #414141", +"c c #3A3A3A", +"d c #3C3C3C", +"e c #8A8A8A", +"f c #979797", +"g c #303030", +"h c #1B1B1B", +"i c #3E3E3E", +"j c #6C6C6C", +"k c #323232", +"l c #0E0E0E", +"m c #000000", +"n c #464646", +"o c #4A4A4A", +"p c #010101", +"q c #0D0D0D", +"r c #717171", +"s c #7B7B7B", +"t c #AFAFAF", +"u c #2D2D2D", +"v c #2B2B2B", +"w c #060606", +"x c #090909", +"y c #858585", +"z c #272727", +"A c #181818", +"B c #151515", +"C c #696969", +"D c #808080", +"E c #383838", +"F c #909090", +"G c #676767", +"H c #080808", +"I c #020202", +"J c #2F2F2F", +"K c #1F1F1F", +"L c #212121", +"M c #525252", +"N c #9C9C9C", +"O c #A5A5A5", +"P c #ACACAC", +"Q c #B0B0B0", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" .+@@@@@@@@@@@#$% ", +" &@************@= ", +" -;>,,,,,,,,,,,,') ", +" !~,,,,,,,,,,,,{] ", +" ^/'''''''''''(_: ", +" <[~}|+!122223: ", +" 456789&0abcd}@@@@@@@@@@@#$% ", +" ea1: fgh@ij*********@= ", +" -klmn,,,,,,,,,,') ", +" opmqr,,,,,,,,,{;st", +" .qmmu'''''''';vw$ ", +" |xwy22222*zmmAt ", +" .+@@@@@@@@@@@#iBC 1lmmD ", +" &@************@8E|F: fGHIb ", +" -;>,,,,,,,,,,,,'j#JKLJMN$O ", +" !~,,,,,,,,,,,,{] PQ ", +" ^/'''''''''''(_: ", +" 3222222222223: ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreatePassiveRB.xpm b/Extras/MayaPlugin/icons/dynamicaCreatePassiveRB.xpm new file mode 100644 index 000000000..82ccb9496 --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreatePassiveRB.xpm @@ -0,0 +1,37 @@ +/* XPM */ +static char * dynamicaCreatePassiveRB_xpm[] = { +"32 32 2 1", +" c None", +". c #E0AE36", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................", +"................................"}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreatePassiveSphereRB.xpm b/Extras/MayaPlugin/icons/dynamicaCreatePassiveSphereRB.xpm new file mode 100644 index 000000000..467eca862 --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreatePassiveSphereRB.xpm @@ -0,0 +1,177 @@ +/* XPM */ +static char * dynamicaCreatePassiveSphereRB_xpm[] = { +"32 32 142 2", +" c #B1B1B1", +". c #ADADAD", +"+ c #ABABAB", +"@ c #AEAEAE", +"# c #A8A8A8", +"$ c #A5A5A5", +"% c #B2B2B2", +"& c #B6B6B6", +"* c #B5B5B5", +"= c #A4A4A4", +"- c #AAAAAA", +"; c #B0B0B0", +"> c #A9A9A9", +", c #C3C3C3", +"' c #D4D4D4", +") c #D5D5D5", +"! c #D3D3D3", +"~ c #D2D2D2", +"{ c #D0D0D0", +"] c #CDCDCD", +"^ c #C7C7C7", +"/ c #D6D6D6", +"( c #CFCFCF", +"_ c #CBCBCB", +": c #C2C2C2", +"< c #BABABA", +"[ c #A7A7A7", +"} c #B9B9B9", +"| c #D1D1D1", +"1 c #CECECE", +"2 c #CACACA", +"3 c #C5C5C5", +"4 c #BFBFBF", +"5 c #B8B8B8", +"6 c #C8C8C8", +"7 c #BBBBBB", +"8 c #A0A0A0", +"9 c #A2A2A2", +"0 c #C6C6C6", +"a c #BEBEBE", +"b c #9F9F9F", +"c c #939393", +"d c #929292", +"e c #ACACAC", +"f c #B3B3B3", +"g c #C1C1C1", +"h c #838383", +"i c #767676", +"j c #9D9D9D", +"k c #AFAFAF", +"l c #7C7C7C", +"m c #797979", +"n c #777777", +"o c #848484", +"p c #A3A3A3", +"q c #C4C4C4", +"r c #CCCCCC", +"s c #A1A1A1", +"t c #919191", +"u c #808080", +"v c #727272", +"w c #6B6B6B", +"x c #8A8A8A", +"y c #9E9E9E", +"z c #656565", +"A c #3D3D3D", +"B c #343434", +"C c #414141", +"D c #626262", +"E c #707070", +"F c #737373", +"G c #646464", +"H c #4B4B4B", +"I c #424242", +"J c #6E6E6E", +"K c #BCBCBC", +"L c #8E8E8E", +"M c #7A7A7A", +"N c #666666", +"O c #5E5E5E", +"P c #575757", +"Q c #8C8C8C", +"R c #5F5F5F", +"S c #363636", +"T c #8D8D8D", +"U c #606060", +"V c #4F4F4F", +"W c #676767", +"X c #747474", +"Y c #141414", +"Z c #000000", +"` c #696969", +" . c #5C5C5C", +".. c #505050", +"+. c #4E4E4E", +"@. c #6A6A6A", +"#. c #020202", +"$. c #0F0F0F", +"%. c #6F6F6F", +"&. c #565656", +"*. c #717171", +"=. c #7B7B7B", +"-. c #A6A6A6", +";. c #9B9B9B", +">. c #979797", +",. c #151515", +"'. c #2E2E2E", +"). c #858585", +"!. c #989898", +"~. c #515151", +"{. c #0C0C0C", +"]. c #686868", +"^. c #909090", +"/. c #898989", +"(. c #828282", +"_. c #383838", +":. c #050505", +"<. c #030303", +"[. c #464646", +"}. c #525252", +"|. c #181818", +"1. c #7E7E7E", +"2. c #535353", +"3. c #2F2F2F", +"4. c #0D0D0D", +"5. c #0E0E0E", +"6. c #545454", +"7. c #191919", +"8. c #262626", +"9. c #3F3F3F", +"0. c #4C4C4C", +"a. c #888888", +"b. c #080808", +"c. c #959595", +"d. c #595959", +"e. c #2B2B2B", +"f. c #101010", +"g. c #1D1D1D", +"h. c #9C9C9C", +"i. c #969696", +"j. c #818181", +"k. c #636363", +" ", +" ", +" ", +" ", +" ", +" . + + + @ ", +" @ # $ % & & * . = - ; ", +" > > , ' ) ! ~ { ] ^ * = - ", +" ; > & ) / / ) ! ~ ( _ ^ : < [ > ", +" > } / / / / ' ! | 1 2 3 4 5 $ - ", +" + ; ! ' ) / ) ' ~ { ] 6 : 7 % > 8 9 @ ", +" = _ ! ! ' ' ' ! | 1 _ 0 a * + b c d # ", +" e f | | ~ ! ! ~ | 1 _ ^ g 5 . 8 d h i j k ", +" 9 l m n i o p q ( r 6 0 : < @ s t u v w x + ", +" y z A B C D E F G H I J f g K 5 @ b L M J N O n # ", +" x P Q . p q 3 0 0 0 # R S = z + 8 T i w U P V W [ ", +" = K a a a a K < X Y Z U t n ` ...+.+.` [ ", +" $ % f % ; @ e @.#.Z $.%.z &.+.+.+.+.*.> . =.k ", +" > # -.9 y ;.>.d &.,.Z Z '.+.+.+.+.+.+.).e !.~.{.]. ", +" . 9 !.^./.(.M F J W _.:.<.[.+.+.+.+.}.X '.Z Z |.k ", +" [ ^.1.X %.@.G .2.+.3.4.3.+.+.+.+.m ).5.Z Z u ", +" e j X @.G .6.+.+.+.+.S 7.8.9.0.O a.N b.#.C ", +" - c.z d...+.+.+.+.+.+.[.e.Y f.g.'.}.h.N $ ", +" > i.O +.+.+.+.+.+.+.+.+.W j -.; ", +" + 9 j.k.+.+.+.+.~.].T [ . ", +" + -.8 d d c p [ . ", +" @ @ @ ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Extras/MayaPlugin/icons/dynamicaCreatePassiveSphereRBArray.xpm b/Extras/MayaPlugin/icons/dynamicaCreatePassiveSphereRBArray.xpm new file mode 100644 index 000000000..b2178c14f --- /dev/null +++ b/Extras/MayaPlugin/icons/dynamicaCreatePassiveSphereRBArray.xpm @@ -0,0 +1,122 @@ +/* XPM */ +static char * dynamicaCreatePassiveSphereRBArray_xpm[] = { +"32 32 87 1", +" c #B1B1B1", +". c #A6A6A6", +"+ c #A0A0A0", +"@ c #949494", +"# c #6D6D6D", +"$ c #5D5D5D", +"% c #636363", +"& c #616161", +"* c #888888", +"= c #9C9C9C", +"- c #5A5A5A", +"; c #969696", +"> c #A2A2A2", +", c #878787", +"' c #757575", +") c #8E8E8E", +"! c #A4A4A4", +"~ c #535353", +"{ c #B0B0B0", +"] c #565656", +"^ c #ADADAD", +"/ c #A9A9A9", +"( c #5E5E5E", +"_ c #A5A5A5", +": c #848484", +"< c #606060", +"[ c #5C5C5C", +"} c #656565", +"| c #707070", +"1 c #8B8B8B", +"2 c #A7A7A7", +"3 c #979797", +"4 c #6C6C6C", +"5 c #808080", +"6 c #838383", +"7 c #9E9E9E", +"8 c #3D3D3D", +"9 c #343434", +"0 c #454545", +"a c #585858", +"b c #525252", +"c c #5B5B5B", +"d c #424242", +"e c #434343", +"f c #AAAAAA", +"g c #8D8D8D", +"h c #939393", +"i c #8A8A8A", +"j c #575757", +"k c #8C8C8C", +"l c #595959", +"m c #323232", +"n c #646464", +"o c #AFAFAF", +"p c #767676", +"q c #9D9D9D", +"r c #141414", +"s c #000000", +"t c #686868", +"u c #020202", +"v c #131313", +"w c #7B7B7B", +"x c #545454", +"y c #1D1D1D", +"z c #2C2C2C", +"A c #989898", +"B c #515151", +"C c #0C0C0C", +"D c #676767", +"E c #121212", +"F c #060606", +"G c #2E2E2E", +"H c #181818", +"I c #1F1F1F", +"J c #696969", +"K c #7E7E7E", +"L c #0E0E0E", +"M c #787878", +"N c #383838", +"O c #555555", +"P c #909090", +"Q c #080808", +"R c #414141", +"S c #2F2F2F", +"T c #494949", +"U c #666666", +"V c #929292", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" .+ .+ ", +" @#$%&* @#$%&* ", +" =-; >%, =-; >%, ", +" ') !~{ ') !~{ ", +" ]^ %+ ]^ %+ ", +" -/ (_ -/ (_ ", +" >:<[}|1234 56 34 ", +" 7}890abc]de~, 2~5.fgah ", +" ijk^ f6$l4]m7nof6$lpq ", +" .+ |rst .+ ", +" @#$%&*|usvg#$%&* ^wo", +" =-; >%xyssz; >%, ABCt ", +" ') !~{DEF7 !~5GssHo ", +" ]^ %+ ~IJ %KLss5 ", +" -/ (_ -MNOP^ cnQuR ", +" 56 34 56+ +*/ + +//mathUtils.h + +#ifndef DYN_MATH_UTILS_H +#define DYN_MATH_UTILS_H + +#include "mvl/vec.h" +#include "mvl/mat.h" +#include "mvl/quat.h" +using namespace mvl; + +typedef vec vec3f; +typedef mat mat4x4f; +typedef mat mat3x3f; +typedef vec quatf; + +template +inline T deg2rad(T x) { return x * T(3.141592654 / 180.0); } + +template +inline T rad2deg(T x) { return x * T(180.0 / 3.141592654); } + + +template +inline T clamp(T x, T min, T max) +{ + if(x < min) return min; + if(x > max) return max; + return x; +} + +template +inline T sqr(T x) { + return x * x; +} + + +// A must be a symmetric matrix. +// returns quaternion q such that its corresponding matrix Q +// can be used to Diagonalize A +//Diagonal matrix D = Q^T * A * Q; and A = Q*D*Q^T +// The colums of q are the eigenvectors D's diagonal is the eigenvalues +// As per 'column' convention if float3x3 Q = q.getmatrix(); then Q*v = q*v*conj(q) +template +vec diagonalizer(const mat &A) +{ + const int maxsteps = 24; // certainly wont need that many. + + typedef vec vec3_t; + typedef vec quat_t; + typedef mat mat3x3_t; + quat_t q(qidentity()); + for(int i = 0; i < maxsteps; ++i) + { + mat3x3_t Q; + q_to_mat(q, Q); // Q*v == q*v*conj(q) + mat3x3_t D = prod(trans(Q), mat3x3_t(prod(A, Q))); // A = Q^T*D*Q + vec3_t offdiag(D(2, 1), D(2, 0), D(1, 0)); // elements not on the diagonal + vec3_t om(fabs(offdiag[0]), fabs(offdiag[1]), fabs(offdiag[2])); // mag of each offdiag elem + int k = (om[0] > om[1] && om[0] > om[2]) ? 0 : (om[1] > om[2]) ? 1 : 2; // index of largest element of offdiag + int k1 = (k + 1) % 3; + int k2 = (k + 2) % 3; + if(offdiag[k] == T()) break; // diagonal already + T thet = (D(k2, k2) - D(k1, k1)) / (T(2.0) * offdiag[k]); + T sgn = (thet > 0.0f) ? T(1.0) : T(-1.0); + thet *= sgn; // make it positive + T t = sgn / (thet + ((thet < T(1.E6)) ? sqrtf(sqr(thet) + T(1.0)) : thet)) ; // sign(T)/(|T|+sqrt(T^2+1)) + T c = T(1.0) / sqrtf(sqr(t) + T(1.0)); // c= 1/(t^2+1) , t=s/c + if(c == T(1.0)) break; // no room for improvement - reached machine precision. + quat_t jr(0,0,0,0); // jacobi rotation for this iteration. + jr[1 + k] = sgn * sqrtf((T(1.0) - c) / T(2.0)); // using 1/2 angle identity sin(a/2) = sqrt((1-cos(a))/2) + jr[1 + k] *= -T(1.0); // since our quat-to-matrix convention was for v*M instead of M*v + jr[0] = sqrtf(T(1.0) - sqr(jr[1 + k])); + if(jr[0] == T(1.0)) break; // reached limits of floating point precision + q = qprod(q, jr); + q = normalize(q); + } + return q; +} + +template +inline T determinant(vec const& v0, vec const& v1, vec const& v2) +{ + return dot(v0, cross(v1, v2)); +} + +template +T volume(vec const* vertices, int const* indices, const int num_indices) +{ + // count is the number of triangles (tris) + T volume = T(); + for(int i = 0; i < num_indices / 3; i++) { // for each triangle + volume += determinant(vertices[indices[i * 3 + 0]], + vertices[indices[i * 3 + 1]], + vertices[indices[i * 3 + 2]]); + } + return volume / T(6.0); // since the determinant give 6 times tetra volume +} + +template +vec center_of_mass(vec const* vertices, int const* indices, int num_indices) +{ + // count is the number of triangles (tris) + vec com(0, 0, 0); + + T volume = 0; // actually accumulates the volume*6 + for(int i = 0; i < num_indices / 3; i++) // for each triangle + { + T vol = determinant(vertices[indices[i * 3 + 0]], + vertices[indices[i * 3 + 1]], + vertices[indices[i * 3 + 2]]); + com += vol * (vertices[indices[i * 3 + 0]] + vertices[indices[i * 3 + 1]] + vertices[indices[i * 3 + 2]]); + volume += vol; + } + com /= volume * 4.0f; + return com; +} + +template +mat inertia(vec const* vertices, int const* indices, int num_indices, vec com = vec(0, 0, 0)) +{ + typedef vec vec3_t; + typedef mat mat3x3_t; + // count is the number of triangles (tris) + // The moments are calculated based on the center of rotation com which is [0,0,0] by default + // assume mass==1.0 you can multiply by mass later. + // for improved accuracy the next 3 variables, the determinant d, and its calculation should be changed to double + T volume = 0; // technically this variable accumulates the volume times 6 + vec3_t diag(0,0,0); // accumulate matrix main diagonal integrals [x*x, y*y, z*z] + vec3_t offd(0,0,0); // accumulate matrix off-diagonal integrals [y*z, x*z, x*y] + + for(int i=0; i < num_indices / 3; i++) // for each triangle + { + vec3_t const &v0(vertices[indices[i * 3 + 0]]); + vec3_t const &v1(vertices[indices[i * 3 + 1]]); + vec3_t const &v2(vertices[indices[i * 3 + 2]]); + mat3x3_t A(v0[0] - com[0], v0[1] - com[1], v0[2] - com[2], + v1[0] - com[0], v1[1] - com[1], v1[2] - com[2], + v2[0] - com[0], v2[1] - com[1], v2[2] - com[2]); + // vol of tiny parallelapiped= d * dr * ds * dt (the 3 partials of my tetral triple integral equation) + T d = determinant(vec(A(0, 0), A(1, 0), A(2, 0)), + vec(A(0, 1), A(1, 1), A(2, 1)), + vec(A(0, 2), A(1, 2), A(2, 2))); + volume +=d; // add vol of current tetra (note it could be negative - that's ok we need that sometimes) + for(int j = 0; j < 3; ++j) { + int j1=(j+1)%3; + int j2=(j+2)%3; + diag[j] += (A(0, j) * A(1, j) + A(1, j) * A(2, j) + A(2, j) * A(0, j) + + A(0, j) * A(0, j) + A(1, j) * A(1, j) + A(2, j) * A(2, j) ) * d; // divide by 60.0f later; + offd[j] += (A(0, j1) * A(1, j2) + A(1, j1) * A(2, j2) + A(2, j1) * A(0, j2) + + A(0, j1) * A(2, j2) + A(1, j1) * A(0, j2) + A(2, j1) * A(1, j2) + + A(0, j1) * A(0, j2) * T(2) + A(1, j1) * A(1, j2) * T(2) + A(2, j1) * A(2, j2) * T(2)) *d; // divide by 120.0f later + } + } + diag /= volume * (T(60.0) / T(6.0)); // divide by total volume (vol/6) since density=1/volume + offd /= volume * (T(120.0) / T(6.0)); + return mat3x3_t(diag[1] + diag[2] , -offd[2] , -offd[1], + -offd[2] , diag[0] + diag[2], -offd[0], + -offd[1] , -offd[0] , diag[0] + diag[1] ); +} + +#endif diff --git a/Extras/MayaPlugin/mayaUtils.h b/Extras/MayaPlugin/mayaUtils.h new file mode 100644 index 000000000..8960366c9 --- /dev/null +++ b/Extras/MayaPlugin/mayaUtils.h @@ -0,0 +1,38 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//mayaUtils.h + +#ifndef DYN_MAYA_UTILS_H +#define DYN_MAYA_UTILS_H + +#define MCHECKSTATUS(status, context) \ + { \ + if(!status) { \ + std::cout << "maya error: " << status.errorString().asChar() \ + << " while: " << context << std::endl; \ + return status; \ + } \ + } + +#endif + diff --git a/Extras/MayaPlugin/mesh_shape.h b/Extras/MayaPlugin/mesh_shape.h new file mode 100644 index 000000000..b686aa531 --- /dev/null +++ b/Extras/MayaPlugin/mesh_shape.h @@ -0,0 +1,44 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//mesh_shape.h + +#ifndef DYN_MESH_SHAPE_H +#define DYN_MESH_SHAPE_H + +#include "collision_shape.h" +#include "collision_shape_impl.h" + +class mesh_shape_t: public collision_shape_t +{ +public: + //typedefs + typedef shared_ptr pointer; + +protected: + friend class solver_t; + + mesh_shape_t(collision_shape_impl_t* impl): collision_shape_t(impl) { } + +}; + +#endif diff --git a/Extras/MayaPlugin/mesh_shape_impl.h b/Extras/MayaPlugin/mesh_shape_impl.h new file mode 100644 index 000000000..6aacf6ed6 --- /dev/null +++ b/Extras/MayaPlugin/mesh_shape_impl.h @@ -0,0 +1,39 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//mesh_shape_impl.h + +#ifndef DYN_MESH_SHAPE_IMPL_H +#define DYN_MESH_SHAPE_IMPL_H + +#include "collision_shape_impl.h" + +class mesh_shape_impl_t: public collision_shape_impl_t +{ +public: + //typedefs + +private: + +}; + +#endif diff --git a/Extras/MayaPlugin/mvl/base.h b/Extras/MayaPlugin/mvl/base.h new file mode 100644 index 000000000..ac7c618e0 --- /dev/null +++ b/Extras/MayaPlugin/mvl/base.h @@ -0,0 +1,35 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//base.h + +#ifndef MVL_BASE_H +#define MVL_BASE_H + +namespace mvl { + + + +} //namespace mvl + +#endif + diff --git a/Extras/MayaPlugin/mvl/mat.h b/Extras/MayaPlugin/mvl/mat.h new file mode 100644 index 000000000..008894c68 --- /dev/null +++ b/Extras/MayaPlugin/mvl/mat.h @@ -0,0 +1,399 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//mat.h + +#ifndef MVL_MAT_H +#define MVL_MAT_H + +#include +#include "base.h" +#include "traits.h" + +namespace mvl { + +template +class mat +{ +public: + typedef T value_type; + typedef T& reference; + typedef T const& const_reference; + typedef T* iterator; + typedef T const* const_iterator; + typedef std::reverse_iterator reverse_iterator; + typedef std::reverse_iterator const_reverse_iterator; + +public: + enum { + Rows = R, + Cols = C, + Size = Rows * Cols, + }; + +public: + //constructors + explicit mat() {} + + template + mat(mat const& m) + { + *this = m; + } + + explicit mat(value_type val) + { + for(int i = 0; i < Size; ++i){ + m_data[i] = val; + } + } + + explicit mat(value_type m00, value_type m01, + value_type m10, value_type m11) + { + operator()(0, 0) = m00; operator()(0, 1) = m01; + operator()(1, 0) = m10; operator()(1, 1) = m11; + } + + explicit mat(value_type m00, value_type m01, value_type m02, + value_type m10, value_type m11, value_type m12, + value_type m20, value_type m21, value_type m22) + { + operator()(0, 0) = m00; operator()(0, 1) = m01; operator()(0, 2) = m02; + operator()(1, 0) = m10; operator()(1, 1) = m11; operator()(1, 2) = m12; + operator()(2, 0) = m20; operator()(2, 1) = m21; operator()(2, 2) = m22; + } + + explicit mat(value_type m00, value_type m01, value_type m02, value_type m03, + value_type m10, value_type m11, value_type m12, value_type m13, + value_type m20, value_type m21, value_type m22, value_type m23, + value_type m30, value_type m31, value_type m32, value_type m33) + { + operator()(0, 0) = m00; operator()(0, 1) = m01; operator()(0, 2) = m02; operator()(0, 3) = m03; + operator()(1, 0) = m10; operator()(1, 1) = m11; operator()(1, 2) = m12; operator()(1, 3) = m13; + operator()(2, 0) = m20; operator()(2, 1) = m21; operator()(2, 2) = m22; operator()(2, 3) = m23; + operator()(3, 0) = m30; operator()(3, 1) = m31; operator()(3, 2) = m32; operator()(3, 3) = m33; + } + +public: + //data access + value_type operator()(std::size_t i, std::size_t j) const { return m_data[j * Rows + i]; } + reference operator()(std::size_t i, std::size_t j) { return m_data[j * Rows + i]; } + +public: + //stl + static std::size_t size() { return Size; } + static std::size_t max_size() { return Size; } + static bool empty() { return false; } + + iterator begin() { return m_data; } + iterator end() { return m_data + Size; } + const_iterator begin() const { return m_data; } + const_iterator end() const { return m_data + Size; } + reverse_iterator rbegin() { return reverse_iterator(end()); } + reverse_iterator rend() { return reverse_iterator(begin()); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } + + value_type front() { return m_data[0]; } + value_type back() { return m_data[Size - 1]; } + const_reference front() const { return m_data[0]; } + const_reference back() const { return m_data[Size - 1]; } + + friend std::ostream& operator << (std::ostream& out, mat const& m) { + out << "("; + for(size_t i = 0; i < Rows - 1; i++) { + for(size_t j = 0; j < Cols; j++) { + out << m(i, j) << ", "; + } + out << std::endl; + } + for(size_t j = 0; j < Cols - 1; j++) { + out << m(Rows - 1, j) << ", "; + } + out << m(Rows - 1, Cols - 1) << ")"; + return out; + } + +public: + // + mat& operator=(mat const& rhs) { + std::copy(rhs.begin(),rhs.end(), begin()); + return *this; + } + + template + mat& operator=(mat const& rhs) { + std::copy(rhs.begin(),rhs.end(), begin()); + return *this; + } + +private: + //data is stored in column major order, so the matrix can passed directly to the graphics APIs + T m_data[Size]; +}; + +//assignment operators +// OP(mat, mat) +// OP(mat, T) + +#define MAT_IMPLEMENT_MACRO(OP) \ +template \ +inline \ +mat& \ +operator OP(mat& lhs, mat const& rhs) { \ + for(int i = 0; i < C * R; ++i) { \ + lhs[i] OP rhs[i]; \ + } \ + return lhs; \ +} \ + \ +template \ +inline \ +mat& \ +operator OP(mat& lhs, typename mat::value_type const& rhs) { \ + for(int i = 0; i < C * R; ++i) { \ + lhs[i] OP rhs[i]; \ + } \ + return lhs; \ +} \ + +MAT_IMPLEMENT_MACRO(+=) +MAT_IMPLEMENT_MACRO(-=) +MAT_IMPLEMENT_MACRO(*=) +MAT_IMPLEMENT_MACRO(/=) + +#undef MAT_IMPLEMENT_MACRO + +//operator + (mat, mat) +template +inline +mat::value_type, R, C> +operator + (mat const& lhs, mat const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs(i, j) + rhs(i, j); + } + } + return res; +} + +//operator - (mat, mat) +template +inline +mat::value_type, R, C> +operator - (mat const& lhs, mat const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs(i, j) - rhs(i, j); + } + } + return res; +} + +//operator * (mat, POD) +template +inline +mat::value_type, R, C> +operator * (mat const& lhs, T2 const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs(i, j) * rhs; + } + } + return res; +} + +//operator * (POD, mat) +template +inline +mat::value_type, R, C> +operator * (T1 const& lhs, mat const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs * rhs(i, j); + } + } + return res; +} + +//operator / (mat, POD) +template +inline +mat::value_type, R, C> +operator / (mat const& lhs, T2 const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs(i, j) / rhs; + } + } + return res; +} + +//element_prod(mat, mat) +template +inline +mat::value_type, R, C> +element_prod(mat const& lhs, mat const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs(i, j) * rhs(i, j); + } + } + return res; +} + +//element_div(mat, mat) +template +inline +mat::value_type, R, C> +element_div(mat const& lhs, mat const& rhs) { + mat::value_type, R, C> res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = lhs(i, j) / rhs(i, j); + } + } + return res; +} + +//unary operator -(mat) +template +inline +mat +operator -(mat const& rhs) { + mat res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = -rhs(i, j); + } + } + return res; +} + +//matrix transpose +template +inline +mat +trans(mat const& rhs) { + mat res; + for(int i = 0; i < R ; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = rhs(j, i); + } + } + return res; +} + +//identity matrix +template +inline +mat +identity() { + mat res; + for(int i = 0; i < Sz ; ++i) { + for(int j = 0; j < Sz; ++j) { + res(i, j) = i == j ? 1 : 0; + } + } + return res; +} + +//matrix diagonal as vector (for square matrices) +template +inline +vec +diag(mat const& rhs) { + vec res; + for(int i = 0; i < N; ++i) { + res[i] = rhs(i, i); + } + return res; +} + +//matrix row as vector +template +inline +vec +row(mat const& rhs, std::size_t r) { + vec res; + for(int i = 0; i < C; ++i) { + res[i] = rhs(r, i); + } + return res; +} + +//matrix column as vector +template +inline +vec +col(mat const& rhs, std::size_t c) { + vec res; + for(int i = 0; i < R; ++i) { + res[i] = rhs(i, c); + } + return res; +} + + +//matrix-matrix product +template +inline +mat::value_type, R1, C2> +prod(mat const& lhs, mat const& rhs) { + mat::value_type, R1, C2> res; + for(int i = 0; i < R1; ++i) { + for(int j = 0; j < C2; ++j) { + res(i, j) = 0; + for(int k = 0; k < C1; ++k) { + res(i, j) += lhs(i, k) * rhs(k, j); + } + } + } + return res; +} + +//matrix - column vector product +template +inline +vec::value_type, R> +prod(mat const& lhs, vec const& rhs) { + vec::value_type, R> res; + for(int i = 0; i < R; ++i) { + res(i) = 0; + for(int j = 0; j < C; ++j) { + res(i) += lhs(i, j) * rhs(j); + } + } + return res; +} + + +} // namespace mvl + +#endif diff --git a/Extras/MayaPlugin/mvl/quat.h b/Extras/MayaPlugin/mvl/quat.h new file mode 100644 index 000000000..7736135e3 --- /dev/null +++ b/Extras/MayaPlugin/mvl/quat.h @@ -0,0 +1,280 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//quat.h + +#ifndef MVL_QUAT_H +#define MVL_QUAT_H + +#include + +#include "vec.h" +#include "mat.h" + +//quaternions are vectors of size 4 +// it's assumed that the layout is in the form (w, (x, y, z)), +// so that the identity quaternion is (1, 0, 0, 0) + +namespace mvl { + +//quaternion conjugate +template +inline vec +qconj(vec const& rhs) { + return vec(-rhs[0], rhs[1], rhs[2], rhs[3]); +} + +//quaternion identity +template +inline +vec +qidentity() { + return vec(1, 0, 0, 0); +} + +//quaternion - quaternion product +template +inline +vec::value_type, 4> +qprod(vec const& lhs, vec const& rhs) { + typedef typename promote_traits::value_type value_type; + return vec((lhs(0)*rhs(0)) - (lhs(1)*rhs(1)) - (lhs(2)*rhs(2)) - (lhs(3)*rhs(3)), + (lhs(0)*rhs(1)) + (lhs(1)*rhs(0)) + (lhs(2)*rhs(3)) - (lhs(3)*rhs(2)), + (lhs(0)*rhs(2)) - (lhs(1)*rhs(3)) + (lhs(2)*rhs(0)) + (lhs(3)*rhs(1)), + (lhs(0)*rhs(3)) + (lhs(1)*rhs(2)) - (lhs(2)*rhs(1)) + (lhs(3)*rhs(0))); +} + +//quanternion - vector product (rotation) +template +inline +vec::value_type, 3> +qprod(vec const& q, vec const& v) { + typedef typename promote_traits::value_type value_type; + vec tmp = qprod(qprod(q, vec(0, v[0], v[1], v[2])), qconj(q)); + return vec(tmp[0], tmp[1], tmp[2]); +} + +//spherical interpolation between q0 and q1 +template +inline +vec::value_type, 4> +qslerp(vec const& q1, vec const& q2, T3 t) { + typedef typename promote_traits::value_type value_type; + value_type omega, cosom, sinom, scale0, scale1; + vec tmp; + + cosom = dot(q1, q2); + + if (cosom < static_cast(0.0)) { + cosom = -cosom; + tmp = -q2; + } else { + tmp = q2; + } + + if ((static_cast(1.0) - cosom) > std::numeric_limits::epsilon()) { + omega = (value_type) acos(cosom); + sinom = sin(omega); + scale0 = sin((static_cast(1.0) - t) * omega) / sinom; + scale1 = sin(t * omega) / sinom; + } else { + scale0 = static_cast(1.0) - t; + scale1 = t; + } + + return scale0 * q1 + scale1 * tmp; +} + +//init quaternion from axis-angle +template +inline +vec::value_type, 4> +q_from_axis_angle(vec const& axis, T2 theta) { + typedef typename promote_traits::value_type value_type; + value_type sin_theta = sin(static_cast(static_cast(0.5)) * theta); + return vec(cos(static_cast(static_cast(0.5)) * theta), + sin_theta * axis[0], + sin_theta * axis[1], + sin_theta * axis[2]); +} + +//get the axis/angle from quaternion +template +inline +void +q_to_axis_angle(vec const& q, vec& axis, T3& theta) { + + T3 half_theta= acos(q[0]); + + if(half_theta > 10 * std::numeric_limits::epsilon()) { + + T3 oost = 1 / sin(half_theta); + + axis[0] = oost * q[1]; + axis[1] = oost * q[2]; + axis[2] = oost * q[3]; + theta = 2 * half_theta; + } else { + axis[0] = axis[1] = axis[2] = 0; + theta = 0; + } +} + +//init quaternion from rotation matrix +template +inline +vec +q_from_mat(mat const& m) { + T1 trace, s, hos; + trace = m(0, 0) + m(1, 1) + m(2, 2); + if (trace > static_cast(0.0)) { + s = sqrt(trace + static_cast(1.0)); + hos = static_cast(0.5) / s; + return vec(s * static_cast(0.5), (m(2, 1) - m(1, 2)) * hos, (m(0, 2) - m(2, 0)) * hos, (m(1, 0) - m(0, 1)) * hos); + } else { + int biggest; + enum {A,T,I}; + if (m(0, 0) > m(1, 1)) { + if (m(2, 2) > m(0, 0)) biggest = I; + else biggest = A; + } else { + if (m(2, 2) > m(0, 0)) biggest = I; + else biggest = T; + } + switch (biggest) { + case A: + s = sqrt( m(0, 0) - (m(1, 1) + m(2, 2)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(2, 1) - m(1, 2)) * hos, s * static_cast(0.5), (m(0, 1) + m(1, 0)) * hos, (m(0, 2) + m(2, 0)) * hos); + } + // I + s = sqrt( m(2, 2) - (m(0, 0) + m(1, 1)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(1, 0) - m(0, 1)) * hos, (m(2, 0) + m(0, 2)) * hos, (m(2, 1) + m(1, 2)) * hos, s * static_cast(0.5)); + } + // T + s = sqrt( m(1, 1) - (m(2, 2) + m(0, 0)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(0, 2) - m(2, 0)) * hos, (m(1, 0) + m(0, 1)) * hos, s * static_cast(0.5), (m(1, 2) + m(2, 1)) * hos); + } + break; + case T: + s = sqrt( m(1, 1) - (m(2, 2) + m(0, 0)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(0, 2) - m(2, 0)) * hos, (m(1, 0) + m(0, 1)) * hos, s * static_cast(0.5), (m(1, 2) + m(2, 1)) * hos); + } + // I + s = sqrt( m(2, 2) - (m(0, 0) + m(1, 1)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(1, 0) - m(0, 1)) * hos, (m(2, 0) + m(0, 2)) * hos, (m(2, 1) + m(1, 2)) * hos, s * static_cast(0.5)); + } + // A + s = sqrt( m(0, 0) - (m(1, 1) + m(2, 2)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(2, 1) - m(1, 2)) * hos, s * static_cast(0.5), (m(0, 1) + m(1, 0)) * hos, (m(0, 2) + m(2, 0)) * hos); + } + break; + case I: + s = sqrt( m(2, 2) - (m(0, 0) + m(1, 1)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(1, 0) - m(0, 1)) * hos, (m(2, 0) + m(0, 2)) * hos, (m(2, 1) + m(1, 2)) * hos, s * static_cast(0.5)); + } + // A + s = sqrt( m(0, 0) - (m(1, 1) + m(2, 2)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(2, 1) - m(1, 2)) * hos, s * static_cast(0.5), (m(0, 1) + m(1, 0)) * hos, (m(0, 2) + m(2, 0)) * hos); + } + // T + s = sqrt( m(1, 1) - (m(2, 2) + m(0, 0)) + static_cast(1.0)); + if (s > (100 * std::numeric_limits::epsilon())) { + hos = static_cast(0.5) / s; + return vec((m(0, 2) - m(2, 0)) * hos, (m(1, 0) + m(0, 1)) * hos, s * static_cast(0.5), (m(1, 2) + m(2, 1)) * hos); + } + break; + } + } +} + +//get rotation matrix from quaternion +template +inline +void +q_to_mat(vec const& q, mat& m) { + T X2,Y2,Z2; //2*QX, 2*QY, 2*QZ + T XX2,YY2,ZZ2; //2*QX*QX, 2*QY*QY, 2*QZ*QZ + T XY2,XZ2,XW2; //2*QX*QY, 2*QX*QZ, 2*QX*QW + T YZ2,YW2,ZW2; // ... + + X2 = 2 * q[1]; + XX2 = X2 * q[1]; + XY2 = X2 * q[2]; + XZ2 = X2 * q[3]; + XW2 = X2 * q[0]; + + Y2 = 2 * q[2]; + YY2 = Y2 * q[2]; + YZ2 = Y2 * q[3]; + YW2 = Y2 * q[0]; + + Z2 = 2 * q[3]; + ZZ2 = Z2 * q[3]; + ZW2 = Z2 * q[0]; + + m(0, 0) = 1 - YY2 - ZZ2; + m(0, 1) = XY2 - ZW2; + m(0, 2) = XZ2 + YW2; + + m(1, 0) = XY2 + ZW2; + m(1, 1) = 1 - XX2 - ZZ2; + m(1, 2) = YZ2 - XW2; + + m(2, 0) = XZ2 - YW2; + m(2, 1) = YZ2 + XW2; + m(2, 2) = 1 - XX2 - YY2; + +} + +template +mat +cmat(T const* m) +{ + mat res; + for(int i = 0; i < R; ++i) { + for(int j = 0; j < C; ++j) { + res(i, j) = m[i * C + j]; + } + } + return res; +} + +} //namespace mvl + + +#endif diff --git a/Extras/MayaPlugin/mvl/traits.h b/Extras/MayaPlugin/mvl/traits.h new file mode 100644 index 000000000..65e6b01e6 --- /dev/null +++ b/Extras/MayaPlugin/mvl/traits.h @@ -0,0 +1,85 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//traits.h + +#ifndef MVL_TRAITS_H +#define MVL_TRAITS_H + +namespace mvl { + +//simple promotion for now + +//check if a type is a POD +template +struct isPOD { enum { value = false }; }; +template<> struct isPOD { enum { value = true }; }; +template<> struct isPOD { enum { value = true }; }; +template<> struct isPOD { enum { value = true }; }; +template<> struct isPOD { enum { value = true }; }; +template<> struct isPOD { enum { value = true }; }; +template<> struct isPOD { enum { value = true }; }; + +// +template struct ifThenElse { typedef T2 value_type; }; +template struct ifThenElse { typedef T1 value_type; }; + +template +struct promote_traits +{ + typedef typename ifThenElse::value, T2, T1>::value_type value_type; +}; + +template +struct promote_traits +{ + typedef T value_type; +}; + +#define TRAITS_DEFINE_MACRO(T1, T2, TP) \ +template<> \ +struct promote_traits \ +{ \ + typedef TP value_type; \ +}; \ +template<> \ +struct promote_traits \ +{ \ + typedef TP value_type; \ +}; + +TRAITS_DEFINE_MACRO(int, float, float) +TRAITS_DEFINE_MACRO(int, double, double) +TRAITS_DEFINE_MACRO(int, long double, long double) + +TRAITS_DEFINE_MACRO(float, double, double) +TRAITS_DEFINE_MACRO(float, long double, long double) + +TRAITS_DEFINE_MACRO(double, long double, long double) + +#undef TRAITS_DEFINE_MACRO + + +} // namespace mvl + +#endif + diff --git a/Extras/MayaPlugin/mvl/util.h b/Extras/MayaPlugin/mvl/util.h new file mode 100644 index 000000000..12ad209d4 --- /dev/null +++ b/Extras/MayaPlugin/mvl/util.h @@ -0,0 +1,62 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//util.h + +#ifndef MVL_UTIL_H +#define MVL_UTIL_H + +#include +#include "base.h" +#include "traits.h" +#include "vec.h" + +namespace mvl { + +//translation +template +inline +mat translation(vec const& v) +{ + return mat(1, 0, 0, v(0), + 0, 1, 0, v(1), + 0, 0, 1, v(2), + 0, 0, 0, 1); + return res; +} + +//scale +template +inline +mat scale(vec const& v) +{ + return mat (v(0), 0, 0, 0, + 0, v(1), 0, 0, + 0, 0, v(2), 0, + 0, 0, 0, 1); +} + +} // namespace mvl + + + +#endif diff --git a/Extras/MayaPlugin/mvl/vec.h b/Extras/MayaPlugin/mvl/vec.h new file mode 100644 index 000000000..a289efbda --- /dev/null +++ b/Extras/MayaPlugin/mvl/vec.h @@ -0,0 +1,347 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//vec.h + +#ifndef MVL_VEC_H +#define MVL_VEC_H + +#include +#include +#include "base.h" +#include "traits.h" + +namespace mvl { + +template +class vec +{ +public: + typedef T value_type; + typedef T& reference; + typedef T const& const_reference; + typedef T* iterator; + typedef T const* const_iterator; + typedef std::reverse_iterator reverse_iterator; + typedef std::reverse_iterator const_reverse_iterator; + +public: + enum { + Size = Sz, + }; + +public: + //constructors + explicit vec() {} + + template + vec(vec const& v) + { + *this = v; + } + + explicit vec(value_type val) + { + for(int i = 0; i < Size; ++i) { + m_data[i] = val; + } + } + + explicit vec(value_type x0, value_type x1) + { + m_data[0] = x0; m_data[1] = x1; + } + + explicit vec(value_type x0, value_type x1, value_type x2) + { + m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; + } + + explicit vec(value_type x0, value_type x1, value_type x2, value_type x3) + { + m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; + } + + explicit vec(value_type x0, value_type x1, value_type x2, value_type x3, value_type x4) + { + m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; m_data[4] = x4; + } + + explicit vec(value_type x0, value_type x1, value_type x2, value_type x3, value_type x4, value_type x5) + { + m_data[0] = x0; m_data[1] = x1; m_data[2] = x2; m_data[3] = x3; m_data[4] = x4; m_data[5] = x5; + } + +public: + //data access + value_type operator[](std::size_t i) const { return m_data[i]; } + reference operator[](std::size_t i) { return m_data[i]; } + + value_type operator()(std::size_t i) const { return m_data[i]; } + reference operator()(std::size_t i) { return m_data[i]; } + +public: + //stl + static std::size_t size() { return Size; } + static std::size_t max_size() { return Size; } + static bool empty() { return false; } + + iterator begin() { return m_data; } + iterator end() { return m_data + Size; } + const_iterator begin() const { return m_data; } + const_iterator end() const { return m_data + Size; } + reverse_iterator rbegin() { return reverse_iterator(end()); } + reverse_iterator rend() { return reverse_iterator(begin()); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } + + value_type front() { return m_data[0]; } + value_type back() { return m_data[Size - 1]; } + const_reference front() const { return m_data[0]; } + const_reference back() const { return m_data[Size - 1]; } + + friend std::ostream& operator << (std::ostream& out, vec const& v) { + out << "("; + for(size_t i = 0; i < Size - 1; i++) { + out << v(i) << ", "; + } + out << v(Size - 1) << ")"; + return out; + } + +public: + //assignment + vec& operator=(vec const& rhs) { + for(int i = 0; i < Size; ++i) { + m_data[i] = rhs[i]; + } + return *this; + } + + template + vec& operator=(vec const& rhs) { + for(int i = 0; i < Size; ++i) { + m_data[i] = rhs[i]; + } + return *this; + } + +private: + T m_data[Size]; +}; + + +//assignment operators +// OP(vec, vec) +// OP(vec, T) + +#define VEC_IMPLEMENT_MACRO(OP) \ +template \ +inline \ +vec& \ +operator OP(vec& lhs, vec const& rhs) { \ + for(int i = 0; i < Sz; ++i) { \ + lhs[i] OP rhs[i]; \ + } \ + return lhs; \ +} \ + \ +template \ +inline \ +vec& \ +operator OP(vec& lhs, T const& rhs) { \ + for(int i = 0; i < Sz; ++i) { \ + lhs[i] OP rhs; \ + } \ + return lhs; \ +} \ + +VEC_IMPLEMENT_MACRO(+=) +VEC_IMPLEMENT_MACRO(-=) +VEC_IMPLEMENT_MACRO(*=) +VEC_IMPLEMENT_MACRO(/=) + +#undef VEC_IMPLEMENT_MACRO + +//operator + (vec, vec) +template +inline +vec::value_type, Sz> +operator + (vec const& lhs, vec const& rhs) +{ + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs[i] + rhs[i]; + } + return res; +} + +//operator - (vec, vec) +template +inline +vec::value_type, Sz> +operator - (vec const& lhs, vec const& rhs) +{ + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs[i] - rhs[i]; + } + return res; +} + +//operator * (vec, POD) +template +inline +vec::value_type, Sz> +operator * (vec const& lhs, T2 const& rhs) { + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs[i] * rhs; + } + return res; +} + +//operator * (POD, vec) +template +inline +vec::value_type, Sz> +operator * (T1 const& lhs, vec const& rhs) { + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs * rhs[i]; + } + return res; +} + +//operator / (vec, POD) +template +inline +vec::value_type, Sz> +operator / (vec const& lhs, T2 const& rhs) { + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs[i] / rhs; + } + return res; +} + +//element_prod(vec, vec) +template +inline +vec::value_type, Sz> +element_prod(vec const& lhs, vec const& rhs) { + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs[i] * rhs[i]; + } + return res; +} + +//element_div(vec, vec) +template +inline +vec::value_type, Sz> +element_div(vec const& lhs, vec const& rhs) { + vec::value_type, Sz> res; + for(int i = 0; i < Sz; ++i) { + res[i] = lhs[i] / rhs[i]; + } + return res; +} + +//unary operator -(expr_vec) +template +inline +vec +operator -(vec const& rhs) { + vec res; + for(int i = 0; i < Sz; ++i) { + res[i] = -rhs[i]; + } + return res; +} + +//dot product +template +inline +typename promote_traits::value_type +dot(vec const& lhs, vec const& rhs) +{ + typename promote_traits::value_type res(0); + for(int i = 0; i < Sz; ++i) { + res += rhs[i] * lhs[i]; + } + return res; +} + + +//cross product +template +inline +vec::value_type, 3> +cross(vec const& lhs, vec const& rhs) { + typedef typename promote_traits::value_type value_type; + return vec(lhs(1)*rhs(2) - rhs(1)*lhs(2), + rhs(0)*lhs(2) - lhs(0)*rhs(2), + lhs(0)*rhs(1) - rhs(0)*lhs(1)); +} + +//length of the vector +template +inline T +norm2(vec const& rhs) +{ + return static_cast(sqrt(dot(rhs, rhs))); +} + +//length of the vector squared +template +inline T +norm_squared(vec const& rhs) +{ + return dot(rhs, rhs); +} + +//normalize the vector +template +inline +vec +normalize(vec const& v) { + typedef T value_type; + T tmp = norm2(v); + if(tmp == value_type(0)) { + tmp = value_type(0); + } else { + tmp = value_type(1) / tmp; + } + vec res; + for(int i = 0; i < Sz; ++i) { + res[i] = v[i] * tmp; + } + return res; +} + + +} //namespace mvl + +#endif + diff --git a/Extras/MayaPlugin/pdbIO.cpp b/Extras/MayaPlugin/pdbIO.cpp new file mode 100644 index 000000000..f77aee2f2 --- /dev/null +++ b/Extras/MayaPlugin/pdbIO.cpp @@ -0,0 +1,308 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +#include "pdbIO.h" +#include +#include +#include + +#define PDB_MAGIC 670 + +//headers used for reading and writing + +struct pdb_channel_data_t +{ + int type; + unsigned int datasize; + unsigned int blocksize; + int num_blocks; + //void **block; + int block; +}; + +struct pdb_channel_t +{ + //char *name; + int name; + int type; + unsigned int size; + unsigned int active_start; + unsigned int active_end; + + char hide; + char disconnect; + //pdb_channel_data_t *data; + int data; + + //pdb_channel_t *link; + int link; + //pdb_channel_t *next; + int next; +}; + +struct pdb_channel_header_t +{ + char magic; + unsigned short swap; + char encoding; + char type; +}; + +/* +struct pdb_data_t +{ + int numAttributes; + int numParticles; + float time; + // short *types; + int types; + // char **names; + int names; + // void **data; + int data; +}; + */ + + +struct pdb_header_t +{ + int magic; + unsigned short swap; + float version; + float time; + unsigned int data_size; + unsigned int num_data; + char padding[32]; + //pdb_channel_t **data; + int data; +}; + +/* +struct pdb_channel_data_t +{ + int type; + unsigned datasize; + unsigned long blocksize; + int num_blocks; + void **block; +}; + +struct pdb_channel_t +{ + char *name; + int type; + unsigned long size; + unsigned long active_start; + unsigned long active_end; + + char hide; + char disconnect; + pdb_channel_data_t *data; + + pdb_channel_t *link; + pdb_channel_t *next; +}; + +struct pdb_channel_header_t +{ + char magic; + unsigned short swap; + char encoding; + char type; +}; + +struct pdb_data_t +{ + int numAttributes; + int numParticles; + float time; + short *types; + char **names; + void **data; +}; + + + +struct pdb_header_t +{ + int magic; + unsigned short swap; + float version; + float time; + unsigned data_size; + unsigned num_data; + char padding[32]; + pdb_channel_t **data; +}; + +*/ + +void read_string( std::istream &in, std::string &str ) +{ + int c; + while( (c = in.get()) ) { + if ( in.eof()) { + str.clear(); + return; + } + str.push_back(c); + } +} + +void write_string( std::ostream &out, std::string &str ) +{ + for(size_t i = 0; i < str.size(); ++i) { + out.put(str[i]); + } + out.put(0); +} + +bool pdb_io_t::read(std::istream &in) +{ + pdb_header_t header; + pdb_channel_header_t channel_header; + pdb_channel_t channel; + pdb_channel_data_t channel_data; + + + // read the header + in.read( (char*)&header, sizeof(pdb_header_t) ); + m_time = header.time; + m_num_particles = header.data_size; + + m_attributes.clear(); + m_attributes.resize( header.num_data ); + + for (unsigned int i=0; i +*/ + +#ifndef PDBIO_H +#define PDBIO_H + +#include +#include + +struct pdb_io_t +{ + enum Type { + kVector = 1, + kReal = 2, + kLong = 3, + kChar = 4, + kPointer = 5 + }; + + struct vec3_t + { + float x; + float y; + float z; + }; + + struct attribute_t + { + std::string m_name; + int m_type; + int m_num_elements; + + // + std::vector< vec3_t > m_vector_data; + std::vector< float > m_real_data; + std::vector< int > m_long_data; + + }; + +//data + float m_time; + int m_num_particles; + std::vector< attribute_t > m_attributes; + + +//methods + + bool read(std::istream &in); + bool write(std::ostream &out); + + pdb_io_t(): + m_time(0.0f) + {} +}; + +#endif + diff --git a/Extras/MayaPlugin/plane_shape.h b/Extras/MayaPlugin/plane_shape.h new file mode 100644 index 000000000..d18722abe --- /dev/null +++ b/Extras/MayaPlugin/plane_shape.h @@ -0,0 +1,44 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//plane_shape.h + +#ifndef DYN_PLANE_SHAPE_H +#define DYN_PLANE_SHAPE_H + +#include "collision_shape.h" +#include "plane_shape_impl.h" + +class plane_shape_t: public collision_shape_t +{ +public: + //typedefs + typedef shared_ptr pointer; + +protected: + friend class solver_t; + + plane_shape_t(collision_shape_impl_t* impl): collision_shape_t(impl) { } + +}; + +#endif diff --git a/Extras/MayaPlugin/plane_shape_impl.h b/Extras/MayaPlugin/plane_shape_impl.h new file mode 100644 index 000000000..f9a496c2d --- /dev/null +++ b/Extras/MayaPlugin/plane_shape_impl.h @@ -0,0 +1,39 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//plane_shape_impl.h + +#ifndef DYN_PLANE_SHAPE_IMPL_H +#define DYN_PLANE_SHAPE_IMPL_H + +#include "collision_shape_impl.h" + +class plane_shape_impl_t: public collision_shape_impl_t +{ +public: + //typedefs + +private: + +}; + +#endif diff --git a/Extras/MayaPlugin/pluginMain.cpp b/Extras/MayaPlugin/pluginMain.cpp new file mode 100644 index 000000000..fd30f16ce --- /dev/null +++ b/Extras/MayaPlugin/pluginMain.cpp @@ -0,0 +1,135 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//pluginMain.cpp + +#include +#include +#include +#include +#include + +#include "mayaUtils.h" +#include "rigidBodyNode.h" +#include "rigidBodyArrayNode.h" +#include "collisionShapeNode.h" +#include "dSolverNode.h" +#include "dSolverCmd.h" +#include "dRigidBodyCmd.h" +#include "dRigidBodyArrayCmd.h" +#include "mvl/util.h" + +MStatus initializePlugin( MObject obj ) +{ + MStatus status; + MFnPlugin plugin( obj, "Walt Disney Feature Animation", "1.0", "Any"); + + int argc = 1; + char* argv[1] = {"ciao"}; + glutInit(&argc, argv); + + solver_t::initialize(); + + // + status = plugin.registerNode( rigidBodyNode::typeName, rigidBodyNode::typeId, + rigidBodyNode::creator, + rigidBodyNode::initialize, + MPxNode::kLocatorNode ); + MCHECKSTATUS(status, "registering rigidBodyNode") + MDGMessage::addNodeRemovedCallback(rigidBodyNode::nodeRemoved, rigidBodyNode::typeName); + + // + status = plugin.registerNode( rigidBodyArrayNode::typeName, rigidBodyArrayNode::typeId, + rigidBodyArrayNode::creator, + rigidBodyArrayNode::initialize, + MPxNode::kLocatorNode ); + MCHECKSTATUS(status, "registering rigidBodyArrayNode") + MDGMessage::addNodeRemovedCallback(rigidBodyArrayNode::nodeRemoved, rigidBodyArrayNode::typeName); + + + // + status = plugin.registerNode( collisionShapeNode::typeName, collisionShapeNode::typeId, + collisionShapeNode::creator, + collisionShapeNode::initialize, + MPxNode::kDependNode ); + MCHECKSTATUS(status, "registering collisionShapeNode") + + // + status = plugin.registerNode( dSolverNode::typeName, dSolverNode::typeId, + dSolverNode::creator, + dSolverNode::initialize, + MPxNode::kDependNode ); + MCHECKSTATUS(status, "registering dSolverNode") + + status = plugin.registerCommand( dSolverCmd::typeName, + dSolverCmd::creator, + dSolverCmd::syntax); + MCHECKSTATUS(status, "registering dSolverCmd") + + status = plugin.registerCommand( dRigidBodyCmd::typeName, + dRigidBodyCmd::creator, + dRigidBodyCmd::syntax); + MCHECKSTATUS(status, "registering dRigidBodyCmd") + + + status = plugin.registerCommand( dRigidBodyArrayCmd::typeName, + dRigidBodyArrayCmd::creator, + dRigidBodyArrayCmd::syntax); + MCHECKSTATUS(status, "registering dRigidBodyArrayCmd") + + MGlobal::executeCommand( "source dynamicaUI.mel" ); + MGlobal::executeCommand( "dynamicaUI_initialize" ); + + return status; +} + +MStatus uninitializePlugin( MObject obj ) +{ + MStatus status; + MFnPlugin plugin( obj ); + + status = plugin.deregisterCommand(dRigidBodyArrayCmd::typeName); + MCHECKSTATUS(status, "deregistering dRigidBodyArrayCmd") + + status = plugin.deregisterCommand(dRigidBodyCmd::typeName); + MCHECKSTATUS(status, "deregistering dRigidBodyCmd") + + status = plugin.deregisterCommand(dSolverCmd::typeName); + MCHECKSTATUS(status, "deregistering dSolverGlobalsCmd") + + status = plugin.deregisterNode(dSolverNode::typeId); + MCHECKSTATUS(status, "deregistering dSolverNode") + + status = plugin.deregisterNode(collisionShapeNode::typeId); + MCHECKSTATUS(status, "deregistering collisionShapeNode") + + status = plugin.deregisterNode(rigidBodyArrayNode::typeId); + MCHECKSTATUS(status, "deregistering rigidBodyArrayNode") + + status = plugin.deregisterNode(rigidBodyNode::typeId); + MCHECKSTATUS(status, "deregistering rigidBodyNode") + + solver_t::cleanup(); + + return status; +} + diff --git a/Extras/MayaPlugin/rigidBodyArrayNode.cpp b/Extras/MayaPlugin/rigidBodyArrayNode.cpp new file mode 100644 index 000000000..9dec3eec4 --- /dev/null +++ b/Extras/MayaPlugin/rigidBodyArrayNode.cpp @@ -0,0 +1,544 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//rigidBodyArrayNode.cpp + +//#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "rigidBodyArrayNode.h" +#include "collisionShapeNode.h" +#include "mayaUtils.h" + +#include "solver.h" + +MTypeId rigidBodyArrayNode::typeId( 0x100314 ); +MString rigidBodyArrayNode::typeName( "dRigidBodyArray" ); + +MObject rigidBodyArrayNode::ia_collisionShape; +MObject rigidBodyArrayNode::ia_solver; +MObject rigidBodyArrayNode::ia_numBodies; +MObject rigidBodyArrayNode::ia_active; +MObject rigidBodyArrayNode::ia_mass; +MObject rigidBodyArrayNode::ia_restitution; +MObject rigidBodyArrayNode::ia_friction; +MObject rigidBodyArrayNode::ia_linearDamping; +MObject rigidBodyArrayNode::ia_angularDamping; +MObject rigidBodyArrayNode::ia_initialPosition; +MObject rigidBodyArrayNode::ia_initialRotation; +MObject rigidBodyArrayNode::ia_initialVelocity; +MObject rigidBodyArrayNode::ia_initialSpin; +MObject rigidBodyArrayNode::ia_fileIO; +MObject rigidBodyArrayNode::ia_fioFiles; +MObject rigidBodyArrayNode::ia_fioPositionAttribute; +MObject rigidBodyArrayNode::ia_fioRotationAttribute; +MObject rigidBodyArrayNode::io_position; +MObject rigidBodyArrayNode::io_rotation; +MObject rigidBodyArrayNode::ca_rigidBodies; +MObject rigidBodyArrayNode::ca_rigidBodyParam; + +MStatus rigidBodyArrayNode::initialize() +{ + MStatus status; + MFnMessageAttribute fnMsgAttr; + MFnNumericAttribute fnNumericAttr; + MFnMatrixAttribute fnMatrixAttr; + MFnTypedAttribute fnTypedAttr; + MFnStringData fnStringData; + + ia_collisionShape = fnMsgAttr.create("inCollisionShape", "incs", &status); + MCHECKSTATUS(status, "creating inCollisionShape attribute") + status = addAttribute(ia_collisionShape); + MCHECKSTATUS(status, "adding inCollisionShape attribute") + + ia_solver = fnMsgAttr.create("solver", "solv", &status); + MCHECKSTATUS(status, "creating solver attribute") + status = addAttribute(ia_solver); + MCHECKSTATUS(status, "adding solver attribute") + + ia_numBodies = fnNumericAttr.create("numBodies", "nbds", MFnNumericData::kInt, 1, &status); + MCHECKSTATUS(status, "creating numBodies attribute") + fnNumericAttr.setKeyable(false); + status = addAttribute(ia_numBodies); + MCHECKSTATUS(status, "adding numBodies attribute") + + ia_active = fnNumericAttr.create("active", "ac", MFnNumericData::kBoolean, 1, &status); + MCHECKSTATUS(status, "creating active attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_active); + MCHECKSTATUS(status, "adding active attribute") + + ia_mass = fnNumericAttr.create("mass", "ma", MFnNumericData::kDouble, 1.0, &status); + MCHECKSTATUS(status, "creating mass attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_mass); + MCHECKSTATUS(status, "adding mass attribute") + + ia_restitution = fnNumericAttr.create("restitution", "rst", MFnNumericData::kDouble, 0.1, &status); + MCHECKSTATUS(status, "creating restitution attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_restitution); + MCHECKSTATUS(status, "adding restitution attribute") + + ia_friction = fnNumericAttr.create("friction", "fc", MFnNumericData::kDouble, 0.5, &status); + MCHECKSTATUS(status, "creating friction attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_friction); + MCHECKSTATUS(status, "adding friction attribute") + + ia_linearDamping = fnNumericAttr.create("linearDamping", "ld", MFnNumericData::kDouble, 0.3, &status); + MCHECKSTATUS(status, "creating linearDamping attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_linearDamping); + MCHECKSTATUS(status, "adding linearDamping attribute") + + ia_angularDamping = fnNumericAttr.create("angularDamping", "ad", MFnNumericData::kDouble, 0.3, &status); + MCHECKSTATUS(status, "creating angularDamping attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_angularDamping); + MCHECKSTATUS(status, "adding angularDamping attribute") + + ia_initialPosition = fnNumericAttr.createPoint("initialPosition", "inpo", &status); + MCHECKSTATUS(status, "creating initialPosition attribute") + fnNumericAttr.setArray(true); + status = addAttribute(ia_initialPosition); + MCHECKSTATUS(status, "adding initialPosition attribute") + + ia_initialRotation = fnNumericAttr.createPoint("initialRotation", "inro", &status); + MCHECKSTATUS(status, "creating initialRotation attribute") + fnNumericAttr.setArray(true); + status = addAttribute(ia_initialRotation); + MCHECKSTATUS(status, "adding initialRotation attribute") + + ia_initialVelocity = fnNumericAttr.createPoint("initialVelocity", "inve", &status); + MCHECKSTATUS(status, "creating initialVelocity attribute") + fnNumericAttr.setArray(true); + status = addAttribute(ia_initialVelocity); + MCHECKSTATUS(status, "adding initialVelocity attribute") + + ia_initialSpin = fnNumericAttr.createPoint("initialSpin", "insp", &status); + MCHECKSTATUS(status, "creating initialSpin attribute") + fnNumericAttr.setArray(true); + status = addAttribute(ia_initialSpin); + MCHECKSTATUS(status, "adding initialSpin attribute") + + ia_fileIO = fnNumericAttr.create("fileIO", "fio", MFnNumericData::kBoolean, 0, &status); + MCHECKSTATUS(status, "creating fileIO attribute") + fnNumericAttr.setKeyable(false); + status = addAttribute(ia_fileIO); + MCHECKSTATUS(status, "adding fileIO attribute") + + ia_fioFiles = fnTypedAttr.create( "files", "fls", MFnData::kString, + fnStringData.create("/tmp/rigidBodyArray.${frame}.pdb"), &status ); + MCHECKSTATUS(status, "creating ia_fioFiles attribute") + fnTypedAttr.setKeyable(false); + status = addAttribute(ia_fioFiles); + MCHECKSTATUS(status, "adding ia_fioFiles attribute") + + /* ia_fioPositionAttribute = fnTypedAttr.create( "positionAttribute", "posa", MFnData::kString, + fnStringData.create("position"), &status ); + MCHECKSTATUS(status, "creating ia_fioPositionAttribute attribute") + fnTypedAttr.setKeyable(false); + status = addAttribute(ia_fioPositionAttribute); + MCHECKSTATUS(status, "adding ia_fioPositionAttribute attribute") + + ia_fioRotationAttribute = fnTypedAttr.create( "rotationAttribute", "rota", MFnData::kString, + fnStringData.create("rotation"), &status ); + MCHECKSTATUS(status, "creating ia_fioRotationAttribute attribute") + fnTypedAttr.setKeyable(false); + status = addAttribute(ia_fioRotationAttribute); + MCHECKSTATUS(status, "adding ia_fioRotationAttribute attribute")*/ + + /* + MObject rigidBodyArrayNode::ia_fioFiles; +MObject rigidBodyArrayNode::ia_fioPositionAttribute; +MObject rigidBodyArrayNode::ia_fioRotationAttribute;*/ + + io_position = fnNumericAttr.createPoint("position", "pos", &status); + MCHECKSTATUS(status, "creating position attribute") + fnNumericAttr.setArray(true); + status = addAttribute(io_position); + MCHECKSTATUS(status, "adding io_position attribute") + + io_rotation = fnNumericAttr.createPoint("rotation", "rot", &status); + MCHECKSTATUS(status, "creating rotation attribute") + fnNumericAttr.setArray(true); + status = addAttribute(io_rotation); + MCHECKSTATUS(status, "adding io_rotation attribute") + + ca_rigidBodies = fnNumericAttr.create("ca_rigidBodies", "carb", MFnNumericData::kBoolean, 0, &status); + MCHECKSTATUS(status, "creating ca_rigidBodies attribute") + fnNumericAttr.setConnectable(false); + fnNumericAttr.setHidden(true); + fnNumericAttr.setStorable(false); + fnNumericAttr.setKeyable(false); + status = addAttribute(ca_rigidBodies); + MCHECKSTATUS(status, "adding ca_rigidBodies attribute") + + ca_rigidBodyParam = fnNumericAttr.create("ca_rigidBodyParam", "carbp", MFnNumericData::kBoolean, 0, &status); + MCHECKSTATUS(status, "creating ca_rigidBodyParam attribute") + fnNumericAttr.setConnectable(false); + fnNumericAttr.setHidden(true); + fnNumericAttr.setStorable(false); + fnNumericAttr.setKeyable(false); + status = addAttribute(ca_rigidBodyParam); + MCHECKSTATUS(status, "adding ca_rigidBodyParam attribute") + + status = attributeAffects(ia_numBodies, ca_rigidBodies); + MCHECKSTATUS(status, "adding attributeAffects(ia_numBodies, ca_rigidBodies)") + + status = attributeAffects(ia_numBodies, ca_rigidBodyParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_numBodies, ca_rigidBodyParam)") + + status = attributeAffects(ia_collisionShape, ca_rigidBodies); + MCHECKSTATUS(status, "adding attributeAffects(ia_collisionShape, ca_rigidBodies)") + + status = attributeAffects(ia_collisionShape, ca_rigidBodyParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_collisionShape, ca_rigidBodyParam)") + + status = attributeAffects(ia_mass, ca_rigidBodyParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_mass, ca_rigidBodyParam)") + + status = attributeAffects(ia_restitution, ca_rigidBodyParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_restitution, ca_rigidBodyParam)") + + status = attributeAffects(ia_friction, ca_rigidBodyParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_friction, ca_rigidBodyParam)") + + status = attributeAffects(ia_linearDamping, ca_rigidBodyParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_linearDamping, ca_rigidBodyParam)") + + status = attributeAffects(ia_angularDamping, ca_rigidBodyParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_angularDamping, ca_rigidBodyParam)") + + return MS::kSuccess; +} + +rigidBodyArrayNode::rigidBodyArrayNode() +{ + // std::cout << "rigidBodyArrayNode::rigidBodyArrayNode" << std::endl; +} + +rigidBodyArrayNode::~rigidBodyArrayNode() +{ + // std::cout << "rigidBodyArrayNode::~rigidBodyArrayNode" << std::endl; + for(size_t i = 0; i < m_rigid_bodies.size(); ++i) { + solver_t::remove_rigid_body(m_rigid_bodies[i]); + } +} + +void rigidBodyArrayNode::nodeRemoved(MObject& node, void *clientData) +{ + // std::cout << "rigidBodyArrayNode::nodeRemoved" << std::endl; + MFnDependencyNode fnNode(node); + rigidBodyArrayNode *thisNode = static_cast(fnNode.userNode()); + for(size_t i = 0; i < thisNode->m_rigid_bodies.size(); ++i) { + solver_t::remove_rigid_body(thisNode->m_rigid_bodies[i]); + } +} + +void rigidBodyArrayNode::postConstructor() +{ + // MStatus status; + // MObject thisObject = thisMObject(); + // MCallbackId cid = MNodeMessage::addAttributeAddedOrRemovedCallback(thisObject, attributeAddedOrRemoved, NULL, &status); +} + +void* rigidBodyArrayNode::creator() +{ + return new rigidBodyArrayNode(); +} + + +bool rigidBodyArrayNode::setInternalValueInContext ( const MPlug & plug, + const MDataHandle & dataHandle, + MDGContext & ctx) +{ + /* if ((plug == pdbFiles) || (plug == ia_scale) || (plug == ia_percent)) { + m_framesDirty = true; + } else if(plug == textureFiles) { + gpufx::m_renderer.setColorTextureDirty(); + }*/ + return false; //setInternalValueInContext(plug,dataHandle,ctx); +} + +MStatus rigidBodyArrayNode::compute(const MPlug& plug, MDataBlock& data) +{ + //std::cout << "rigidBodyArrayNode::compute: " << plug.name() << std::endl; + //MTime time = data.inputValue( rigidBodyArrayNode::inTime ).asTime(); + if(plug == ca_rigidBodies) { + computeRigidBodies(plug, data); + } else if(plug == ca_rigidBodyParam) { + computeRigidBodyParam(plug, data); + } else if(plug.isElement()) { + if(plug.array() == worldMatrix) { + computeWorldMatrix(plug, data); + } else { + return MStatus::kUnknownParameter; + } + } else { + return MStatus::kUnknownParameter; + } + return MStatus::kSuccess; +} + +void rigidBodyArrayNode::draw( M3dView & view, const MDagPath &path, + M3dView::DisplayStyle style, + M3dView::DisplayStatus status ) +{ + // std::cout << "rigidBodyArrayNode::draw" << std::endl; + + update(); + + view.beginGL(); + glPushAttrib( GL_ALL_ATTRIB_BITS ); + + glPushMatrix(); + //remove the parent transform here + double m[4][4]; + m_worldMatrix.inverse().get(m); + glMultMatrixd(&(m[0][0])); + + if(!m_rigid_bodies.empty()) { + mat4x4f xform; + if(style == M3dView::kFlatShaded || + style == M3dView::kGouraudShaded) { + glEnable(GL_LIGHTING); + float material[] = { 0.4, 0.3, 1.0, 1.0 }; + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, material); + for(size_t i = 0; i < m_rigid_bodies.size(); ++i) { + glPushMatrix(); + m_rigid_bodies[i]->get_transform(xform); + glMultMatrixf(xform.begin()); + m_rigid_bodies[i]->collision_shape()->gl_draw(collision_shape_t::kDSSolid); + glPopMatrix(); + } + } + + + if( status == M3dView::kActive || + status == M3dView::kLead || + status == M3dView::kHilite || + ( style != M3dView::kGouraudShaded && style != M3dView::kFlatShaded ) ) { + + glDisable(GL_LIGHTING); + for(size_t i = 0; i < m_rigid_bodies.size(); ++i) { + glPushMatrix(); + m_rigid_bodies[i]->get_transform(xform); + glMultMatrixf(xform.begin()); + m_rigid_bodies[i]->collision_shape()->gl_draw(collision_shape_t::kDSWireframe); + glPopMatrix(); + } + } + } + glPopMatrix(); + glPopAttrib(); + view.endGL(); +} + +bool rigidBodyArrayNode::isBounded() const +{ + //return true; + return false; +} + +MBoundingBox rigidBodyArrayNode::boundingBox() const +{ + // std::cout << "rigidBodyArrayNode::boundingBox()" << std::endl; + //load the pdbs + MObject node = thisMObject(); + + MPoint corner1(-1, -1, -1); + MPoint corner2(1, 1, 1); + return MBoundingBox(corner1, corner2); +} + +//standard attributes + +void rigidBodyArrayNode::computeRigidBodies(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "rigidBodyArrayNode::computeRigidBodies" << std::endl; + + MObject thisObject(thisMObject()); + MPlug plgCollisionShape(thisObject, ia_collisionShape); + MObject update; + //force evaluation of the shape + plgCollisionShape.getValue(update); + size_t numBodies = data.inputValue(ia_numBodies).asInt(); + // MDataHandle coll = data.inputValue(ia_collisionShape); + + // collisionShapeNode * pCollisionShapeNode = NULL; + collision_shape_t::pointer collision_shape; + if(plgCollisionShape.isConnected()) { + MPlugArray connections; + plgCollisionShape.connectedTo(connections, true, true); + if(connections.length() != 0) { + MFnDependencyNode fnNode(connections[0].node()); + if(fnNode.typeId() == collisionShapeNode::typeId) { + collisionShapeNode *pCollisionShapeNode = static_cast(fnNode.userNode()); + collision_shape = pCollisionShapeNode->collisionShape(); + } else { + std::cout << "rigidBodyArrayNode connected to a non-collision shape node!" << std::endl; + } + } + } + + if(!collision_shape) { + //not connected to a collision shape, put a default one + collision_shape = solver_t::create_sphere_shape(); + } + + //save the positions and orientations to restore them + std::vector positions(m_rigid_bodies.size()); + std::vector rotations(m_rigid_bodies.size()); + for(size_t i = 0; i < m_rigid_bodies.size(); ++i) { + m_rigid_bodies[i]->get_transform(positions[i], rotations[i]); + solver_t::remove_rigid_body(m_rigid_bodies[i]); + } + + m_rigid_bodies.resize(numBodies); + for(size_t i = 0; i < m_rigid_bodies.size(); ++i) { + m_rigid_bodies[i] = solver_t::create_rigid_body(collision_shape); + m_rigid_bodies[i]->set_transform(positions[i], rotations[i]); + solver_t::add_rigid_body(m_rigid_bodies[i]); + } + + data.outputValue(ca_rigidBodies).set(true); + data.setClean(plug); +} + + +void rigidBodyArrayNode::computeRigidBodyParam(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "rigidBodyArrayNode::computeRigidBodyParam" << std::endl; + + MObject thisObject(thisMObject()); + MObject update; + + MPlug(thisObject, ca_rigidBodies).getValue(update); + + double mass = data.inputValue(ia_mass).asDouble(); + vec3f inertia; + if(!m_rigid_bodies.empty()) { + inertia = mass * m_rigid_bodies[0]->collision_shape()->local_inertia(); + } + double restitution = data.inputValue(ia_restitution).asDouble(); + double friction = data.inputValue(ia_friction).asDouble(); + double linearDamping = data.inputValue(ia_linearDamping).asDouble(); + double angularDamping = data.inputValue(ia_angularDamping).asDouble(); + + for(size_t i = 0; i < m_rigid_bodies.size(); ++i) { + m_rigid_bodies[i]->set_mass(mass); + m_rigid_bodies[i]->set_inertia(inertia); + m_rigid_bodies[i]->set_restitution(restitution); + m_rigid_bodies[i]->set_friction(friction); + m_rigid_bodies[i]->set_linear_damping(linearDamping); + m_rigid_bodies[i]->set_angular_damping(angularDamping); + } + + data.outputValue(ca_rigidBodyParam).set(true); + data.setClean(plug); +} + +void rigidBodyArrayNode::computeWorldMatrix(const MPlug& plug, MDataBlock& data) +{ + //std::cout << "rigidBodyArrayNode::computeWorldMatrix" << std::endl; + MObject thisObject(thisMObject()); + MFnDagNode fnDagNode(thisObject); + + MObject update; + MPlug(thisObject, ca_rigidBodies).getValue(update); + MPlug(thisObject, ca_rigidBodyParam).getValue(update); + + MFnTransform fnParentTransform(fnDagNode.parent(0)); + MTransformationMatrix dm(fnParentTransform.transformation().asMatrix() * m_worldMatrix.inverse()); + MVector mtranslation = dm.getTranslation(MSpace::kTransform); + MQuaternion mrotation = dm.rotation(); + + // std::cout << mtranslation << std::endl; + + MArrayDataHandle hInitPosArray = data.outputArrayValue(ia_initialPosition); + if(hInitPosArray.elementCount() < m_rigid_bodies.size()) { + std::cout << "rigidBodyArrayNode::computeWorldMatrix: array size mismatch" << std::endl; + } + for(size_t i = 0; i < m_rigid_bodies.size(); ++i) { + MDataHandle hInitPos = hInitPosArray.outputValue(); + float3 &ipos = hInitPos.asFloat3(); + + vec3f pos, newpos; + quatf rot, newrot; + + m_rigid_bodies[i]->get_transform(pos, rot); + + newpos = pos + vec3f(mtranslation.x, mtranslation.y, mtranslation.z); +// newrot = qprod(rot, quatf(mrotation.w, mrotation.x, mrotation.y, mrotation.z)); + newrot = rot; + + m_rigid_bodies[i]->set_transform(newpos, newrot); + + hInitPos.set3Float(ipos[0] + mtranslation.x, ipos[1] + mtranslation.y, ipos[2] + mtranslation.z); + + hInitPosArray.next(); + } + + m_worldMatrix = fnParentTransform.transformation().asMatrix(); + + data.setClean(plug); +} + +std::vector& rigidBodyArrayNode::rigid_bodies() +{ + // std::cout << "rigidBodyArrayNode::rigid_bodies" << std::endl; + + MObject thisObject(thisMObject()); + MObject update; + MPlug(thisObject, ca_rigidBodies).getValue(update); + MPlug(thisObject, ca_rigidBodyParam).getValue(update); + + return m_rigid_bodies; +} + + +void rigidBodyArrayNode::update() +{ + MObject thisObject(thisMObject()); + + MObject update; + MPlug(thisObject, ca_rigidBodies).getValue(update); + MPlug(thisObject, ca_rigidBodyParam).getValue(update); + MPlug(thisObject, ia_solver).getValue(update); + MPlug(thisObject, worldMatrix).elementByLogicalIndex(0).getValue(update); +} diff --git a/Extras/MayaPlugin/rigidBodyArrayNode.h b/Extras/MayaPlugin/rigidBodyArrayNode.h new file mode 100644 index 000000000..ec1c9ab7c --- /dev/null +++ b/Extras/MayaPlugin/rigidBodyArrayNode.h @@ -0,0 +1,120 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//rigidBodyArrayNode.h + +#ifndef DYN_RIGID_BODY_ARRAY_NODE_H +#define DYN_RIGID_BODY_ARRAY_NODE_H + +#include +#include +#include +#include + +#include + +#include "solver.h" + +class rigidBodyArrayNode: public MPxLocatorNode +{ +public: + rigidBodyArrayNode(); + virtual ~rigidBodyArrayNode(); + + virtual void postConstructor(); + + virtual bool setInternalValueInContext ( const MPlug & plug, + const MDataHandle & dataHandle, + MDGContext & ctx); + + // virtual MStatus setDependentsDirty ( const MPlug & plug, MPlugArray & plugArray); + + virtual MStatus compute( const MPlug& plug, MDataBlock& data ); + + virtual void draw( M3dView & view, const MDagPath & path, + M3dView::DisplayStyle style, + M3dView::DisplayStatus status ); + + + virtual bool isBounded() const ; + virtual MBoundingBox boundingBox() const; + + virtual bool excludeAsLocator() const { return false; } + virtual bool isTransparent() const { return false; } + + static void * creator(); + static MStatus initialize(); + +public: + + std::vector& rigid_bodies(); + +public: + + //Attributes + static MObject ia_collisionShape; + static MObject ia_solver; + static MObject ia_numBodies; + static MObject ia_active; + static MObject ia_mass; + static MObject ia_restitution; + static MObject ia_friction; + static MObject ia_linearDamping; + static MObject ia_angularDamping; + + static MObject ia_initialPosition; + static MObject ia_initialRotation; + static MObject ia_initialVelocity; + static MObject ia_initialSpin; + + static MObject ia_fileIO; + static MObject ia_fioFiles; + static MObject ia_fioPositionAttribute; + static MObject ia_fioRotationAttribute; + + static MObject io_position; + static MObject io_rotation; + + static MObject ca_rigidBodies; + static MObject ca_rigidBodyParam; + +public: + static MTypeId typeId; + static MString typeName; + +private: + void update(); + void computeRigidBodies(const MPlug& plug, MDataBlock& data); + void computeRigidBodyParam(const MPlug& plug, MDataBlock& data); + void computeWorldMatrix(const MPlug& plug, MDataBlock& data); + +public: + static void nodeRemoved(MObject& node, void *clientData); + +private: + std::vector m_rigid_bodies; + MMatrix m_worldMatrix; +}; + + + +#endif diff --git a/Extras/MayaPlugin/rigidBodyNode.cpp b/Extras/MayaPlugin/rigidBodyNode.cpp new file mode 100644 index 000000000..ce1cd554d --- /dev/null +++ b/Extras/MayaPlugin/rigidBodyNode.cpp @@ -0,0 +1,526 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//rigidBodyNode.cpp + +//#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "rigidBodyNode.h" +#include "collisionShapeNode.h" +#include "mayaUtils.h" + +#include "solver.h" + +MTypeId rigidBodyNode::typeId( 0x100306 ); +MString rigidBodyNode::typeName( "dRigidBody" ); + +MObject rigidBodyNode::ia_collisionShape; +MObject rigidBodyNode::ia_solver; +MObject rigidBodyNode::ia_active; +MObject rigidBodyNode::ia_mass; +MObject rigidBodyNode::ia_restitution; +MObject rigidBodyNode::ia_friction; +MObject rigidBodyNode::ia_linearDamping; +MObject rigidBodyNode::ia_angularDamping; +MObject rigidBodyNode::ia_initialPosition; +MObject rigidBodyNode::ia_initialRotation; +MObject rigidBodyNode::ia_initialVelocity; +MObject rigidBodyNode::ia_initialSpin; +MObject rigidBodyNode::ca_rigidBody; +MObject rigidBodyNode::ca_rigidBodyParam; + + +MStatus rigidBodyNode::initialize() +{ + MStatus status; + MFnMessageAttribute fnMsgAttr; + MFnNumericAttribute fnNumericAttr; + MFnMatrixAttribute fnMatrixAttr; + + ia_collisionShape = fnMsgAttr.create("inCollisionShape", "incs", &status); + MCHECKSTATUS(status, "creating inCollisionShape attribute") + status = addAttribute(ia_collisionShape); + MCHECKSTATUS(status, "adding inCollisionShape attribute") + + ia_solver = fnMsgAttr.create("solver", "solv", &status); + MCHECKSTATUS(status, "creating solver attribute") + status = addAttribute(ia_solver); + MCHECKSTATUS(status, "adding solver attribute") + + ia_active = fnNumericAttr.create("active", "ac", MFnNumericData::kBoolean, 1, &status); + MCHECKSTATUS(status, "creating active attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_active); + MCHECKSTATUS(status, "adding active attribute") + + ia_mass = fnNumericAttr.create("mass", "ma", MFnNumericData::kDouble, 1.0, &status); + MCHECKSTATUS(status, "creating mass attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_mass); + MCHECKSTATUS(status, "adding mass attribute") + + ia_restitution = fnNumericAttr.create("restitution", "rst", MFnNumericData::kDouble, 0.1, &status); + MCHECKSTATUS(status, "creating restitution attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_restitution); + MCHECKSTATUS(status, "adding restitution attribute") + + ia_friction = fnNumericAttr.create("friction", "fc", MFnNumericData::kDouble, 0.5, &status); + MCHECKSTATUS(status, "creating friction attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_friction); + MCHECKSTATUS(status, "adding friction attribute") + + ia_linearDamping = fnNumericAttr.create("linearDamping", "ld", MFnNumericData::kDouble, 0.3, &status); + MCHECKSTATUS(status, "creating linearDamping attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_linearDamping); + MCHECKSTATUS(status, "adding linearDamping attribute") + + ia_angularDamping = fnNumericAttr.create("angularDamping", "ad", MFnNumericData::kDouble, 0.3, &status); + MCHECKSTATUS(status, "creating angularDamping attribute") + fnNumericAttr.setKeyable(true); + status = addAttribute(ia_angularDamping); + MCHECKSTATUS(status, "adding angularDamping attribute") + + ia_initialPosition = fnNumericAttr.createPoint("initialPosition", "inpo", &status); + MCHECKSTATUS(status, "creating initialPosition attribute") + status = addAttribute(ia_initialPosition); + MCHECKSTATUS(status, "adding initialPosition attribute") + + ia_initialRotation = fnNumericAttr.createPoint("initialRotation", "inro", &status); + MCHECKSTATUS(status, "creating initialRotation attribute") + status = addAttribute(ia_initialRotation); + MCHECKSTATUS(status, "adding initialRotation attribute") + + ia_initialVelocity = fnNumericAttr.createPoint("initialVelocity", "inve", &status); + MCHECKSTATUS(status, "creating initialVelocity attribute") + status = addAttribute(ia_initialVelocity); + MCHECKSTATUS(status, "adding initialVelocity attribute") + + ia_initialSpin = fnNumericAttr.createPoint("initialSpin", "insp", &status); + MCHECKSTATUS(status, "creating initialSpin attribute") + status = addAttribute(ia_initialSpin); + MCHECKSTATUS(status, "adding initialSpin attribute") + + ca_rigidBody = fnNumericAttr.create("ca_rigidBody", "carb", MFnNumericData::kBoolean, 0, &status); + MCHECKSTATUS(status, "creating ca_rigidBody attribute") + fnNumericAttr.setConnectable(false); + fnNumericAttr.setHidden(true); + fnNumericAttr.setStorable(false); + fnNumericAttr.setKeyable(false); + status = addAttribute(ca_rigidBody); + MCHECKSTATUS(status, "adding ca_rigidBody attribute") + + ca_rigidBodyParam = fnNumericAttr.create("ca_rigidBodyParam", "carbp", MFnNumericData::kBoolean, 0, &status); + MCHECKSTATUS(status, "creating ca_rigidBodyParam attribute") + fnNumericAttr.setConnectable(false); + fnNumericAttr.setHidden(true); + fnNumericAttr.setStorable(false); + fnNumericAttr.setKeyable(false); + status = addAttribute(ca_rigidBodyParam); + MCHECKSTATUS(status, "adding ca_rigidBodyParam attribute") + + + status = attributeAffects(ia_collisionShape, ca_rigidBody); + MCHECKSTATUS(status, "adding attributeAffects(ia_collisionShape, ca_rigidBody)") + + status = attributeAffects(ia_collisionShape, ca_rigidBodyParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_collisionShape, ca_rigidBodyParam)") + + status = attributeAffects(ia_mass, ca_rigidBodyParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_mass, ca_rigidBodyParam)") + + status = attributeAffects(ia_restitution, ca_rigidBodyParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_restitution, ca_rigidBodyParam)") + + status = attributeAffects(ia_friction, ca_rigidBodyParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_friction, ca_rigidBodyParam)") + + status = attributeAffects(ia_linearDamping, ca_rigidBodyParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_linearDamping, ca_rigidBodyParam)") + + status = attributeAffects(ia_angularDamping, ca_rigidBodyParam); + MCHECKSTATUS(status, "adding attributeAffects(ia_angularDamping, ca_rigidBodyParam)") + + // status = attributeAffects(ia_active, ca_rigidBodyParam); + // MCHECKSTATUS(status, "adding attributeAffects(ia_active, ca_rigidBodyParam)") + + return MS::kSuccess; +} + +rigidBodyNode::rigidBodyNode() +{ + // std::cout << "rigidBodyNode::rigidBodyNode" << std::endl; +} + +rigidBodyNode::~rigidBodyNode() +{ + // std::cout << "rigidBodyNode::~rigidBodyNode" << std::endl; +} + +void rigidBodyNode::nodeRemoved(MObject& node, void *clientData) +{ + // std::cout << "rigidBodyNode::nodeRemoved" << std::endl; + MFnDependencyNode fnNode(node); + solver_t::remove_rigid_body(static_cast(fnNode.userNode())->m_rigid_body); +} + +void* rigidBodyNode::creator() +{ + return new rigidBodyNode(); +} + + +bool rigidBodyNode::setInternalValueInContext ( const MPlug & plug, + const MDataHandle & dataHandle, + MDGContext & ctx) +{ + /* if ((plug == pdbFiles) || (plug == ia_scale) || (plug == ia_percent)) { + m_framesDirty = true; + } else if(plug == textureFiles) { + gpufx::m_renderer.setColorTextureDirty(); + }*/ + return false; //setInternalValueInContext(plug,dataHandle,ctx); +} + +/* +MStatus rigidBodyNode::setDependentsDirty( const MPlug & plug, MPlugArray & plugArray) +{ + std::cout << "rigidBodyNode::setDependentsDirty: " << plug.name().asChar() << std::endl; + MObject thisNode = thisMObject(); + if(plug == ia_solver) { + MPlug plgAffected(thisNode, ca_update); + plugArray.append(plgAffected); + plgAffected.setValue(true); + } else if(plug == ia_collisionShape) { + //ia_collisionShape -> ca_rigidBody + MPlug plgAffected(thisNode, ca_rigidBody); + plugArray.append(plgAffected); + plgAffected.setValue(true); + + //ia_collisionShape -> ca_rigidBodyParam + plgAffected.setAttribute(ca_rigidBodyParam); + plugArray.append(plgAffected); + plgAffected.setValue(true); + } else if(plug == ca_rigidBody) { + //ca_rigidBody -> ca_update + MPlug plgAffected(thisNode, ca_update); + plugArray.append(plgAffected); + plgAffected.setValue(true); + + //ca_rigidBody -> ca_rigidBodyParam + plgAffected.setAttribute(ca_rigidBodyParam); + plugArray.append(plgAffected); + plgAffected.setValue(true); + } else if(plug == ia_mass) { + //ia_mass -> ca_rigidBodyParam + MPlug plgAffected(thisNode, ca_rigidBodyParam); + plugArray.append(plgAffected); + plgAffected.setValue(true); + + plgAffected.setAttribute(ca_update); + plugArray.append(plgAffected); + plgAffected.setValue(true); + } else if(plug == ca_rigidBodyParam) { + //ca_rigidBodyParam -> ca_update + MPlug plgAffected(thisNode, ca_update); + plugArray.append(plgAffected); + plgAffected.setValue(true); + } + return MS::kSuccess; +}*/ + + +MStatus rigidBodyNode::compute(const MPlug& plug, MDataBlock& data) +{ + //std::cout << "rigidBodyNode::compute: " << plug.name() << std::endl; + //MTime time = data.inputValue( rigidBodyNode::inTime ).asTime(); + if(plug == ca_rigidBody) { + computeRigidBody(plug, data); + } else if(plug == ca_rigidBodyParam) { + computeRigidBodyParam(plug, data); + } else if(plug.isElement()) { + if(plug.array() == worldMatrix && plug.logicalIndex() == 0) { + computeWorldMatrix(plug, data); + } else { + return MStatus::kUnknownParameter; + } + } else { + return MStatus::kUnknownParameter; + } + return MStatus::kSuccess; +} + +void rigidBodyNode::draw( M3dView & view, const MDagPath &path, + M3dView::DisplayStyle style, + M3dView::DisplayStatus status ) +{ + // std::cout << "rigidBodyNode::draw" << std::endl; + + update(); + + view.beginGL(); + glPushAttrib( GL_ALL_ATTRIB_BITS ); + + if(m_rigid_body) { + //remove the scale, since it's already include in the node transform + vec3f scale; + m_rigid_body->collision_shape()->get_scale(scale); + + glPushMatrix(); + glScalef(1/scale[0], 1/scale[1], 1/scale[2]); + + if(style == M3dView::kFlatShaded || + style == M3dView::kGouraudShaded) { + glEnable(GL_LIGHTING); + float material[] = { 0.4, 0.7, 1.0, 1.0 }; + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, material); + m_rigid_body->collision_shape()->gl_draw(collision_shape_t::kDSSolid); + } + + + if( status == M3dView::kActive || + status == M3dView::kLead || + status == M3dView::kHilite || + ( style != M3dView::kGouraudShaded && style != M3dView::kFlatShaded ) ) { + + glDisable(GL_LIGHTING); + m_rigid_body->collision_shape()->gl_draw(collision_shape_t::kDSWireframe); + + } + glPopMatrix(); + } + glPopAttrib(); + view.endGL(); +} + +bool rigidBodyNode::isBounded() const +{ + //return true; + return false; +} + +MBoundingBox rigidBodyNode::boundingBox() const +{ + // std::cout << "rigidBodyNode::boundingBox()" << std::endl; + //load the pdbs + MObject node = thisMObject(); + + MPoint corner1(-1, -1, -1); + MPoint corner2(1, 1, 1); + return MBoundingBox(corner1, corner2); +} + +//standard attributes +void rigidBodyNode::computeRigidBody(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "rigidBodyNode::computeRigidBody" << std::endl; + + MObject thisObject(thisMObject()); + MPlug plgCollisionShape(thisObject, ia_collisionShape); + MObject update; + //force evaluation of the shape + plgCollisionShape.getValue(update); + + vec3f prevCenter(0, 0, 0); + quatf prevRotation(qidentity()); + if(m_rigid_body) { + prevCenter = m_rigid_body->collision_shape()->center(); + prevRotation = m_rigid_body->collision_shape()->rotation(); + } + + collision_shape_t::pointer collision_shape; + if(plgCollisionShape.isConnected()) { + MPlugArray connections; + plgCollisionShape.connectedTo(connections, true, true); + if(connections.length() != 0) { + MFnDependencyNode fnNode(connections[0].node()); + if(fnNode.typeId() == collisionShapeNode::typeId) { + collisionShapeNode *pCollisionShapeNode = static_cast(fnNode.userNode()); + collision_shape = pCollisionShapeNode->collisionShape(); + } else { + std::cout << "rigidBodyNode connected to a non-collision shape node!" << std::endl; + } + } + } + + if(!collision_shape) { + //not connected to a collision shape, put a default one + collision_shape = solver_t::create_sphere_shape(); + } + + /* vec3f deltaCenter = prevCenter - collision_shape->center(); + quatf deltaRotation = qprod(qconj(collision_shape->rotation()), prevRotation); + + MDataHandle hInitPos = data.outputValue(ia_initialPosition); + float3 &ipos = hInitPos.asFloat3(); + + MDataHandle hInitRot = data.outputValue(ia_initialRotation); + float3 &irot = hInitRot.asFloat3(); + MQuaternion iquat = MEulerRotation(deg2rad(irot[0]), deg2rad(irot[1]), deg2rad(irot[2])).asQuaternion(); + + // MVector deltapos(mtranslation.x - pos[0], mtranslation.y - pos[1], mtranslation.z - pos[2]); + // MQuaternion deltarot = MQuaternion(rot[1], rot[2], rot[3], rot[0]).conjugate() * mrotation; + + MVector newipos(ipos[0] + deltaCenter[0], ipos[1] + deltaCenter[1], ipos[2] + deltaCenter[2]); */ + // MEulerRotation newirot((iquat * deltarot).asEulerRotation()); + + //hInitPos.set3Float(newipos.x, newipos.y, newipos.z); + // hInitRot.set3Float(rad2deg(newirot.x), rad2deg(newirot.y), rad2deg(newirot.z));*/ + + solver_t::remove_rigid_body(m_rigid_body); + m_rigid_body = solver_t::create_rigid_body(collision_shape); + solver_t::add_rigid_body(m_rigid_body); + + data.outputValue(ca_rigidBody).set(true); + data.setClean(plug); +} + + +void rigidBodyNode::computeWorldMatrix(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "rigidBodyNode::computeWorldMatrix" << std::endl; + + MObject thisObject(thisMObject()); + MFnDagNode fnDagNode(thisObject); + + MObject update; + MPlug(thisObject, ca_rigidBody).getValue(update); + MPlug(thisObject, ca_rigidBodyParam).getValue(update); + + vec3f pos; + quatf rot; + + MFnTransform fnParentTransform(fnDagNode.parent(0)); + MVector mtranslation = fnParentTransform.getTranslation(MSpace::kTransform); + MQuaternion mrotation; + fnParentTransform.getRotation(mrotation, MSpace::kTransform); + double mscale[3]; + fnParentTransform.getScale(mscale); + + // std::cout << mtranslation << std::endl; + + m_rigid_body->get_transform(pos, rot); + + MDataHandle hInitPos = data.outputValue(ia_initialPosition); + float3 &ipos = hInitPos.asFloat3(); + + MDataHandle hInitRot = data.outputValue(ia_initialRotation); + float3 &irot = hInitRot.asFloat3(); + MQuaternion iquat = MEulerRotation(deg2rad(irot[0]), deg2rad(irot[1]), deg2rad(irot[2])).asQuaternion(); + + MVector deltapos(mtranslation.x - pos[0], mtranslation.y - pos[1], mtranslation.z - pos[2]); + MQuaternion deltarot = MQuaternion(rot[1], rot[2], rot[3], rot[0]).conjugate() * mrotation; + + MVector newipos(ipos[0] + deltapos.x, ipos[1] + deltapos.y, ipos[2] + deltapos.z); + MEulerRotation newirot((iquat * deltarot).asEulerRotation()); + + hInitPos.set3Float(newipos.x, newipos.y, newipos.z); + hInitRot.set3Float(rad2deg(newirot.x), rad2deg(newirot.y), rad2deg(newirot.z)); + + m_rigid_body->set_transform(vec3f(mtranslation.x, mtranslation.y, mtranslation.z), + quatf(mrotation.w, mrotation.x, mrotation.y, mrotation.z)); + + data.setClean(plug); + + //set the scale to the collision shape + m_rigid_body->collision_shape()->set_scale(vec3f(mscale[0], mscale[1], mscale[2])); +/* + MPlug plgCollisionShape(thisObject, ia_collisionShape); + //force evaluation of the shape + plgCollisionShape.getValue(update); + + if(plgCollisionShape.isConnected()) { + MPlugArray connections; + plgCollisionShape.connectedTo(connections, true, true); + if(connections.length() != 0) { + MFnDependencyNode fnNode(connections[0].node()); + if(fnNode.typeId() == collisionShapeNode::typeId) { + MPlug plgScale(fnNode.object(), collisionShapeNode::ia_scale); + plgScale.child(0).setValue(mscale[0]); + plgScale.child(1).setValue(mscale[1]); + plgScale.child(2).setValue(mscale[2]); + } else { + std::cout << "rigidBodyNode connected to a non-collision shape node!" << std::endl; + } + } + }*/ + +} + +void rigidBodyNode::computeRigidBodyParam(const MPlug& plug, MDataBlock& data) +{ + // std::cout << "rigidBodyNode::computeRigidBodyParam" << std::endl; + + MObject thisObject(thisMObject()); + MObject update; + + MPlug(thisObject, ca_rigidBody).getValue(update); + double mass = data.inputValue(ia_mass).asDouble(); + m_rigid_body->set_mass(mass); + m_rigid_body->set_inertia(mass * m_rigid_body->collision_shape()->local_inertia()); + m_rigid_body->set_restitution(data.inputValue(ia_restitution).asDouble()); + m_rigid_body->set_friction(data.inputValue(ia_friction).asDouble()); + m_rigid_body->set_linear_damping(data.inputValue(ia_linearDamping).asDouble()); + m_rigid_body->set_angular_damping(data.inputValue(ia_angularDamping).asDouble()); + // m_rigid_body->set_kinematic(!data.inputValue(ia_active).asBool()); + + data.outputValue(ca_rigidBodyParam).set(true); + data.setClean(plug); +} + +rigid_body_t::pointer rigidBodyNode::rigid_body() +{ + // std::cout << "rigidBodyNode::rigid_body" << std::endl; + + MObject thisObject(thisMObject()); + MObject update; + MPlug(thisObject, ca_rigidBody).getValue(update); + MPlug(thisObject, ca_rigidBodyParam).getValue(update); + + return m_rigid_body; +} + +void rigidBodyNode::update() +{ + MObject thisObject(thisMObject()); + + MObject update; + MPlug(thisObject, ca_rigidBody).getValue(update); + MPlug(thisObject, ca_rigidBodyParam).getValue(update); + MPlug(thisObject, ia_solver).getValue(update); + MPlug(thisObject, worldMatrix).elementByLogicalIndex(0).getValue(update); +// MPlug plg = MPlug(thisObject, worldMatrix).elementByLogicalIndex(0); +} diff --git a/Extras/MayaPlugin/rigidBodyNode.h b/Extras/MayaPlugin/rigidBodyNode.h new file mode 100644 index 000000000..d0fe2dd40 --- /dev/null +++ b/Extras/MayaPlugin/rigidBodyNode.h @@ -0,0 +1,107 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//rigidBodyNode.h + +#ifndef DYN_RIGID_BODY_NODE_H +#define DYN_RIGID_BODY_NODE_H + +#include +#include +#include + +#include "solver.h" + +class rigidBodyNode: public MPxLocatorNode +{ +public: + rigidBodyNode(); + virtual ~rigidBodyNode(); + + virtual bool setInternalValueInContext ( const MPlug & plug, + const MDataHandle & dataHandle, + MDGContext & ctx); + + // virtual MStatus setDependentsDirty ( const MPlug & plug, MPlugArray & plugArray); + + virtual MStatus compute( const MPlug& plug, MDataBlock& data ); + + virtual void draw( M3dView & view, const MDagPath & path, + M3dView::DisplayStyle style, + M3dView::DisplayStatus status ); + + + virtual bool isBounded() const ; + virtual MBoundingBox boundingBox() const; + + virtual bool excludeAsLocator() const { return false; } + virtual bool isTransparent() const { return false; } + + static void * creator(); + static MStatus initialize(); + +public: + + rigid_body_t::pointer rigid_body(); + +public: + + //Attributes + static MObject ia_collisionShape; + static MObject ia_solver; + static MObject ia_active; + static MObject ia_mass; + static MObject ia_restitution; + static MObject ia_friction; + static MObject ia_linearDamping; + static MObject ia_angularDamping; + + static MObject ia_initialPosition; + static MObject ia_initialRotation; + static MObject ia_initialVelocity; + static MObject ia_initialSpin; + + static MObject ca_rigidBody; + static MObject ca_rigidBodyParam; + +public: + static MTypeId typeId; + static MString typeName; + +private: + void update(); + void computeRigidBody(const MPlug& plug, MDataBlock& data); + void computeWorldMatrix(const MPlug& plug, MDataBlock& data); + void computeRigidBodyParam(const MPlug& plug, MDataBlock& data); + +public: + static void nodeRemoved(MObject& node, void *clientData); + +private: + rigid_body_t::pointer m_rigid_body; + + +}; + + + +#endif diff --git a/Extras/MayaPlugin/rigid_body.h b/Extras/MayaPlugin/rigid_body.h new file mode 100644 index 000000000..48d62ef81 --- /dev/null +++ b/Extras/MayaPlugin/rigid_body.h @@ -0,0 +1,89 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//rigid_body.h + +#ifndef DYN_RIGID_BODY_H +#define DYN_RIGID_BODY_H + +#include "shared_ptr.h" +#include "collision_shape.h" +#include "mathUtils.h" + +#include "rigid_body_impl.h" + +class rigid_body_t +{ +public: + //typedefs + typedef shared_ptr pointer; + + // + collision_shape_t::pointer collision_shape() { return m_collision_shape; } + + // + void set_kinematic(bool kinematic) { m_impl->set_kinematic(kinematic); } + + // + void set_mass(float mass) { m_impl->set_mass(mass); } + void set_inertia(vec3f const& I) { m_impl->set_inertia(I); } + void set_restitution(float r) { m_impl->set_restitution(r); } + void set_friction(float f) { m_impl->set_friction(f); } + void set_linear_damping(float d) { m_impl->set_linear_damping(d); } + void set_angular_damping(float d) { m_impl->set_angular_damping(d); } + + void set_transform(vec3f const& position, quatf const& rotation) { m_impl->set_transform(position, rotation); } + void get_transform(vec3f& position, quatf& rotation) const { m_impl->get_transform(position, rotation); } + void get_transform(mat4x4f& xform) const { m_impl->get_transform(xform); } + + // + void set_linear_velocity(vec3f const& v) { m_impl->set_linear_velocity(v); } + void get_linear_velocity(vec3f& v) const { m_impl->get_linear_velocity(v); } + + void set_angular_velocity(vec3f const& v) { m_impl->set_angular_velocity(v); } + void get_angular_velocity(vec3f& v) const { m_impl->get_angular_velocity(v); } + + // + void clear_forces() { m_impl->clear_forces(); } + void apply_central_force(vec3f const& f) { m_impl->apply_central_force(f); } + void apply_torque(vec3f const& t) { m_impl->apply_torque(t); } + +public: + virtual ~rigid_body_t() {}; + +protected: + friend class solver_t; + rigid_body_t(rigid_body_impl_t* impl, collision_shape_t::pointer& shape): m_impl(impl), m_collision_shape(shape) + { + } + + rigid_body_impl_t* impl() { return m_impl.get(); } + // rigid_body_impl_t const* impl() const { return m_impl.get(); } + +private: + shared_ptr m_impl; + collision_shape_t::pointer m_collision_shape; +}; + + + +#endif diff --git a/Extras/MayaPlugin/rigid_body_impl.h b/Extras/MayaPlugin/rigid_body_impl.h new file mode 100644 index 000000000..0b73d6694 --- /dev/null +++ b/Extras/MayaPlugin/rigid_body_impl.h @@ -0,0 +1,63 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + + +//rigid_body_impl.h + +#ifndef DYN_RIGID_BODY_IMPL_H +#define DYN_RIGID_BODY_IMPL_H + +#include "rigid_body_impl.h" +#include "mathUtils.h" + +class rigid_body_impl_t +{ +public: + virtual void set_kinematic(bool kinematic) = 0; + + // + virtual void set_mass(float mass) = 0; + virtual void set_inertia(vec3f const& I) = 0; + virtual void set_restitution(float r) = 0; + virtual void set_friction(float f) = 0; + virtual void set_linear_damping(float d) = 0; + virtual void set_angular_damping(float d) = 0; + + virtual void set_transform(vec3f const& position, quatf const& rotation) = 0; + virtual void get_transform(vec3f& position, quatf& rotation) const = 0; + virtual void get_transform(mat4x4f& xform) const = 0; + + virtual void set_linear_velocity(vec3f const& v) = 0; + virtual void get_linear_velocity(vec3f& v) const = 0; + + virtual void set_angular_velocity(vec3f const& v) = 0; + virtual void get_angular_velocity(vec3f& v) const = 0; + + virtual void clear_forces() = 0; + virtual void apply_central_force(vec3f const& f) = 0; + virtual void apply_torque(vec3f const& t) = 0; + +public: + virtual ~rigid_body_impl_t() {}; +}; + +#endif diff --git a/Extras/MayaPlugin/scripts/AEdCollisionShapeTemplate.mel b/Extras/MayaPlugin/scripts/AEdCollisionShapeTemplate.mel new file mode 100644 index 000000000..52f4185be --- /dev/null +++ b/Extras/MayaPlugin/scripts/AEdCollisionShapeTemplate.mel @@ -0,0 +1,41 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//AEdCollisionShapeTemplate.mel + +global proc AEdCollisionShapeTemplate( string $nodeName ) +{ + + editorTemplate -beginScrollLayout; + + editorTemplate -addControl inShape; + editorTemplate -addControl outCollisionShape; + editorTemplate -addControl type; + editorTemplate -addControl scale; + + AEdependNodeTemplate $nodeName; + + editorTemplate -addExtraControls; + editorTemplate -endScrollLayout; + +} + diff --git a/Extras/MayaPlugin/scripts/AEdRigidBodyArrayTemplate.mel b/Extras/MayaPlugin/scripts/AEdRigidBodyArrayTemplate.mel new file mode 100644 index 000000000..3e213a915 --- /dev/null +++ b/Extras/MayaPlugin/scripts/AEdRigidBodyArrayTemplate.mel @@ -0,0 +1,89 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//AEdRigidBodyArrayTemplate.mel + +global proc AEdRigidBodyArrayTemplate( string $nodeName ) +{ + + editorTemplate -beginScrollLayout; + + editorTemplate -addControl inCollisionShape; + editorTemplate -addControl numBodies; + editorTemplate -addControl active; + editorTemplate -addControl mass; + editorTemplate -addControl restitution; + editorTemplate -addControl friction; + editorTemplate -addControl linearDamping; + editorTemplate -addControl angularDamping; + + editorTemplate -beginLayout "Initial configuration" -collapse 1; + editorTemplate -addControl initialPosition; + editorTemplate -addControl initialRotation; + editorTemplate -addControl initialVelocity; + editorTemplate -addControl initialSpin; + editorTemplate -endLayout; + + editorTemplate -beginLayout "Current configuration" -collapse 1; + editorTemplate -addControl position; + editorTemplate -addControl rotation; + editorTemplate -endLayout; + + editorTemplate -beginLayout "File IO" -collapse 1; + editorTemplate -addControl fileIO; + editorTemplate -addControl files; + editorTemplate -addControl positionAttribute; + editorTemplate -addControl rotationAttribute; + editorTemplate -endLayout; + + editorTemplate -addControl solver; + + editorTemplate -beginLayout (uiRes("m_AElocatorTemplate.kLocatorAttributes")) -collapse 1; + AElocatorCommon $nodeName; + editorTemplate -endLayout; + + { + editorTemplate -suppress "motionBlur"; + editorTemplate -suppress "visibleInReflections"; + editorTemplate -suppress "visibleInRefractions"; + editorTemplate -suppress "maxVisibilitySamplesOverride"; + editorTemplate -suppress "maxVisibilitySamples"; + editorTemplate -suppress "geometryAntialiasingOverride"; + editorTemplate -suppress "antialiasingLevel"; + editorTemplate -suppress "shadingSamplesOverride"; + editorTemplate -suppress "shadingSamples"; + editorTemplate -suppress "maxShadingSamples"; + editorTemplate -suppress "volumeSamplesOverride"; + editorTemplate -suppress "volumeSamples"; + editorTemplate -suppress "depthJitter"; + editorTemplate -suppress "ignoreSelfShadowing"; + editorTemplate -suppress "primaryVisibility"; + editorTemplate -suppress "compInstObjGroups"; + } + + AEshapeTemplate $nodeName; + + editorTemplate -addExtraControls; + editorTemplate -endScrollLayout; + +} + diff --git a/Extras/MayaPlugin/scripts/AEdRigidBodyTemplate.mel b/Extras/MayaPlugin/scripts/AEdRigidBodyTemplate.mel new file mode 100644 index 000000000..b2453ded0 --- /dev/null +++ b/Extras/MayaPlugin/scripts/AEdRigidBodyTemplate.mel @@ -0,0 +1,102 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//AEdRigidBodyTemplate.mel + +global proc AEdRigidBodyTemplate( string $nodeName ) +{ + + editorTemplate -beginScrollLayout; + + /* editorTemplate -callCustom + "AEgpufxLCtextureFiles 1" + "AEgpufxLCtextureFiles 0" + "textureFiles"; + editorTemplate -suppress "textureFiles";*/ + + editorTemplate -addControl inCollisionShape; + editorTemplate -addControl active; + editorTemplate -addControl mass; + editorTemplate -addControl restitution; + editorTemplate -addControl friction; + editorTemplate -addControl linearDamping; + editorTemplate -addControl angularDamping; + + editorTemplate -beginLayout "Initial configuration" -collapse 0; + editorTemplate -addControl initialPosition; + editorTemplate -addControl initialRotation; + editorTemplate -addControl initialVelocity; + editorTemplate -addControl initialSpin; + editorTemplate -endLayout; + + editorTemplate -addControl solver; + + editorTemplate -beginLayout (uiRes("m_AElocatorTemplate.kLocatorAttributes")) -collapse 1; + AElocatorCommon $nodeName; + editorTemplate -endLayout; + + { + editorTemplate -suppress "motionBlur"; + editorTemplate -suppress "visibleInReflections"; + editorTemplate -suppress "visibleInRefractions"; + editorTemplate -suppress "maxVisibilitySamplesOverride"; + editorTemplate -suppress "maxVisibilitySamples"; + editorTemplate -suppress "geometryAntialiasingOverride"; + editorTemplate -suppress "antialiasingLevel"; + editorTemplate -suppress "shadingSamplesOverride"; + editorTemplate -suppress "shadingSamples"; + editorTemplate -suppress "maxShadingSamples"; + editorTemplate -suppress "volumeSamplesOverride"; + editorTemplate -suppress "volumeSamples"; + editorTemplate -suppress "depthJitter"; + editorTemplate -suppress "ignoreSelfShadowing"; + editorTemplate -suppress "primaryVisibility"; + editorTemplate -suppress "compInstObjGroups"; + } + + AEshapeTemplate $nodeName; + + editorTemplate -addExtraControls; + editorTemplate -endScrollLayout; + +} + +/* +global proc AEgpufxLCpdbFiles(int $create, string $node) +{ + if ($create) { + rowLayout -nc 3 -cw 3 57; + { + text -l "Pdb Files"; + textField -ann "Path to the pdb files" pdbFilesTF; + button -l "Reload" -ann "Reload pdb files" reloadPdbFilesB; + setParent ..; + } + } + + connectControl pdbFilesTF $node; + + // use dgdirty if we start using attributeAffects + button -e -c ("string $attr = getAttr(\"" +$node +"\"); setAttr " + $node + " -type \"string\" \"\"; setAttr " + $node + " -type \"string\" $attr;") reloadPdbFilesB; +} + +*/ diff --git a/Extras/MayaPlugin/scripts/AEdSolverTemplate.mel b/Extras/MayaPlugin/scripts/AEdSolverTemplate.mel new file mode 100644 index 000000000..3b283405e --- /dev/null +++ b/Extras/MayaPlugin/scripts/AEdSolverTemplate.mel @@ -0,0 +1,50 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//AEdSolverTemplate.mel + +global proc AEdSolverTemplate( string $nodeName ) +{ + + editorTemplate -beginScrollLayout; + + editorTemplate -addControl ssSolverType; + + editorTemplate -addControl gravity; + + editorTemplate -addControl substeps; + + editorTemplate -addControl enabled; + + editorTemplate -addControl splitImpulse; + + editorTemplate -addControl startTime; + + editorTemplate -addControl rigidBodies; + + AEdependNodeTemplate $nodeName; + + editorTemplate -addExtraControls; + editorTemplate -endScrollLayout; + +} + diff --git a/Extras/MayaPlugin/scripts/dynamica.mel b/Extras/MayaPlugin/scripts/dynamica.mel new file mode 100644 index 000000000..226805ceb --- /dev/null +++ b/Extras/MayaPlugin/scripts/dynamica.mel @@ -0,0 +1,23 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//dynamica.mel diff --git a/Extras/MayaPlugin/scripts/dynamicaUI.mel b/Extras/MayaPlugin/scripts/dynamicaUI.mel new file mode 100644 index 000000000..7aa07f350 --- /dev/null +++ b/Extras/MayaPlugin/scripts/dynamicaUI.mel @@ -0,0 +1,643 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//dynamicaUI.mel + +// +global string $dynamicaUIWindow = "dynamicaUIWindow"; + +global proc dynamicaUI_initialize() +{ + dynamicaUI_createShelfButton(); + + //add script jobs + //scriptJob -e "SceneOpened" gpufxGUI_updateSettings; +} + +//main window +global proc dynamicaUI_createWindow() +{ + global string $dynamicaUIWindow; + + //check if the window exists + if ( `window -ex $dynamicaUIWindow` ) + { + showWindow $dynamicaUIWindow; + return; + } + + //create dSolver node if necessary + dSolver; + + $dynamicaUIWindow = `window -t "dynamica"`; + + string $mainForm = `formLayout`; + string $tabs = `tabLayout -innerMarginWidth 5 -innerMarginHeight 5`; + + formLayout -e + -attachForm $tabs "top" 0 + -attachForm $tabs "left" 0 + -attachForm $tabs "bottom" 0 + -attachForm $tabs "right" 0 + $mainForm; + + + string $mainLayt = dynamicaUI_createMainTab(); + string $solverLayt = dynamicaUI_createSolverTab(); + + tabLayout -e -tabLabel $mainLayt "Create" -tabLabel $solverLayt "Solver" $tabs; + + showWindow $dynamicaUIWindow; + // window -e -wh 479 664 $dynamicaUIWindow; +} + + + +global proc dynamicaUI_createShelfButton() +{ + // The shelf we want to add the button to. + string $shelf = "EfxToolsLumiere"; + + // The icon we want to use on the button. + string $iconImage = "dynamica.xpm"; + + // Tle button label. + string $iconBtnLabel = "dynamica"; + + // Specify the shelf as the parent for our tool button. If there + // is no such shelf, we create it. + // + string $btnParent; + if ( `shelfLayout -ex $shelf` ) + { + $btnParent = $shelf; + + // Check to see if the shelf already has the gpufx button. If so, + // we want to delete it before we remake it so we don't end up with + // duplicate buttons on the shelf. + + string $existingShelfButtons[] = `shelfLayout -q -ca $shelf`; + for ( $btn in $existingShelfButtons ) + if ( `shelfButton -q -l $btn` == $iconBtnLabel ) + deleteUI $btn; + } else { + // Create the shelf under the global shelf parent. + global string $gShelfTopLevel; + $btnParent = `shelfLayout -p $gShelfTopLevel $shelf`; + } + + // Make (or remake) the tool button. + shelfButton -label $iconBtnLabel -image1 $iconImage + -command "dynamicaUI_createWindow" -p $btnParent; + +} + +global proc string dynamicaUI_createSolverTab() +{ + global string $dynamicaUI_STsolverType; + global string $dynamicaUI_STgravityX; + global string $dynamicaUI_STgravityY; + global string $dynamicaUI_STgravityZ; + global string $dynamicaUI_STenabled; + global string $dynamicaUI_STsplitImpulse; + global string $dynamicaUI_STsubsteps; + + string $mainForm = `columnLayout -adj 1`; + { + string $solverTypeFrame = `frameLayout -collapsable false -label "Solver Type" -borderStyle "etchedIn"`; + { + rowLayout -nc 1 -adj 1 -cat 1 "left" 30; + { + int $solverType = `getAttr dSolver1.ssSolverType` + 1; // 1-based + $dynamicaUI_STsolverType = `textScrollList -append "Bullet Physics" -append "Ageia PhysX" -append "Stanford PhysBAM" + -selectIndexedItem $solverType + -numberOfRows 1 + -sc dynamicaUI_STSolverTypeChanged`; + setParent ..; + } + setParent ..; + } + string $gravityFrame = `frameLayout -collapsable false -label "Gravity" -borderStyle "etchedIn"`; + { + rowLayout -nc 3 -cat 1 "both" 0 -cat 2 "both" 0 -cat 3 "both" 0 -cw3 50 50 50; + { + float $gravity[] = `getAttr dSolver1.gravity`; + $dynamicaUI_STgravityX = `floatField -precision 3 -value $gravity[0] -changeCommand dynamicaUI_STgravityChanged`; + $dynamicaUI_STgravityY = `floatField -precision 3 -value $gravity[1] -changeCommand dynamicaUI_STgravityChanged`; + $dynamicaUI_STgravityZ = `floatField -precision 3 -value $gravity[2] -changeCommand dynamicaUI_STgravityChanged`; + + setParent ..; + } + setParent ..; + } + string $substepsFrame = `frameLayout -collapsable false -label "Substeps" -borderStyle "etchedIn"`; + { + rowLayout -nc 1 -cat 1 "both" 0 -cw1 50; + { + int $substeps = `getAttr dSolver1.substeps`; + $dynamicaUI_STsubsteps = `intField -value $substeps -changeCommand dynamicaUI_STsubstepsChanged`; + + setParent ..; + } + setParent ..; + } + string $enabledFrame = `frameLayout -collapsable false -label "Solver State" -borderStyle "etchedIn"`; + { + rowLayout -nc 1 -adj 1 -cat 1 "left" 30; + { + int $enabled = `getAttr dSolver1.enabled`; + $dynamicaUI_STenabled = `checkBox -label "Enabled" -value $enabled + -cc dynamicaUI_STenabledChanged`; + setParent ..; + } + setParent ..; + } + string $splitImpulseFrame = `frameLayout -collapsable false -label "SplitImpulse" -borderStyle "etchedIn"`; + { + rowLayout -nc 1 -adj 1 -cat 1 "left" 30; + { + int $enabled = `getAttr dSolver1.splitImpulse`; + $dynamicaUI_STsplitImpulse = `checkBox -label "Enabled" -value $enabled + -cc dynamicaUI_STsplitImpulseChanged`; + setParent ..; + } + setParent ..; + } + setParent ..; + } + + return $mainForm; +} + +global proc string dynamicaUI_createMainTab() +{ + string $mainForm = `columnLayout -adj 1`; + { + frameLayout -collapsable true -label "Active Rigid Bodies" -borderStyle "in"; + { + rowLayout -nc 5; + { + string $createActiveSphereRBBtn = `iconTextButton -style "iconAndTextVertical" -label "Sphere" + -width 100 -image1 "dynamicaCreateActiveSphereRB.xpm" -c ("dynamicaUI_createActiveSphereRB") + -ann "Create an active sphere rigid body"`; + + string $createActiveBoxRBBtn = `iconTextButton -style "iconAndTextVertical" -label "Box" + -width 100 -image1 "dynamicaCreateActiveBoxRB.xpm" -c ("dynamicaUI_createActiveBoxRB") + -ann "Create an active box rigid body"`; + + string $createActivePlaneRBBtn = `iconTextButton -style "iconAndTextVertical" -label "Plane" + -width 100 -image1 "dynamicaCreateActivePlaneRB.xpm" -c ("dynamicaUI_createActivePlaneRB") + -ann "Create an active plane rigid body"`; + + string $createActiveHullRBBtn = `iconTextButton -style "iconAndTextVertical" -label "Hull" + -width 100 -image1 "dynamicaCreateActiveHullRB.xpm" -c ("dynamicaUI_createActiveHullRB") + -ann "Create an active hull rigid body"`; + + string $createActiveMeshRBBtn = `iconTextButton -style "iconAndTextVertical" -label "Mesh" + -width 100 -image1 "dynamicaCreateActiveMeshRB.xpm" -c ("dynamicaUI_createActiveMeshRB") + -ann "Create an active mesh rigid body"`; + + setParent ..; + } + setParent ..; + } + + frameLayout -collapsable true -label "Passive Rigid Bodies" -borderStyle "in"; + { + rowLayout -nc 5; + { + string $createPassiveSphereRBBtn = `iconTextButton -style "iconAndTextVertical" -label "Sphere" + -width 100 -image1 "dynamicaCreatePassiveSphereRB.xpm" -c ("dynamicaUI_createPassiveSphereRB") + -ann "Create an passive sphere rigid body"`; + + string $createPassiveBoxRBBtn = `iconTextButton -style "iconAndTextVertical" -label "Box" + -width 100 -image1 "dynamicaCreatePassiveBoxRB.xpm" -c ("dynamicaUI_createPassiveBoxRB") + -ann "Create an passive box rigid body"`; + + string $createPassivePlaneRBBtn = `iconTextButton -style "iconAndTextVertical" -label "Plane" + -width 100 -image1 "dynamicaCreatePassivePlaneRB.xpm" -c ("dynamicaUI_createPassivePlaneRB") + -ann "Create an passive plane rigid body"`; + + string $createPassiveHullRBBtn = `iconTextButton -style "iconAndTextVertical" -label "Hull" + -width 100 -image1 "dynamicaCreatePassiveHullRB.xpm" -c ("dynamicaUI_createPassiveHullRB") + -ann "Create an passive hull rigid body"`; + + string $createPassiveMeshRBBtn = `iconTextButton -style "iconAndTextVertical" -label "Mesh" + -width 100 -image1 "dynamicaCreatePassiveMeshRB.xpm" -c ("dynamicaUI_createPassiveMeshRB") + -ann "Create an passive mesh rigid body"`; + + setParent ..; + } + setParent ..; + } + + + frameLayout -collapsable true -label "Active Rigid Body Arrays" -borderStyle "in"; + { + rowLayout -nc 5; + { + string $createActiveSphereRBArrayBtn = `iconTextButton -style "iconAndTextVertical" -label "Sphere" + -width 100 -image1 "dynamicaCreateActiveSphereRBArray.xpm" -c ("dynamicaUI_createActiveSphereRBArray") + -ann "Create an active sphere rigid body array"`; + + string $createActiveBoxRBArrayBtn = `iconTextButton -style "iconAndTextVertical" -label "Box" + -width 100 -image1 "dynamicaCreateActiveBoxRBArray.xpm" -c ("dynamicaUI_createActiveBoxRBArray") + -ann "Create an active box rigid body array"`; + + string $createActivePlaneRBArrayBtn = `iconTextButton -style "iconAndTextVertical" -label "Plane" + -width 100 -image1 "dynamicaCreateActivePlaneRBArray.xpm" -c ("dynamicaUI_createActivePlaneRBArray") + -ann "Create an active plane rigid body array"`; + + string $createActiveHullRBArrayBtn = `iconTextButton -style "iconAndTextVertical" -label "Hull" + -width 100 -image1 "dynamicaCreateActiveHullRBArray.xpm" -c ("dynamicaUI_createActiveHullRBArray") + -ann "Create an active hull rigid body array"`; + + string $createActiveMeshRBArrayBtn = `iconTextButton -style "iconAndTextVertical" -label "Mesh" + -width 100 -image1 "dynamicaCreateActiveMeshRBArray.xpm" -c ("dynamicaUI_createActiveMeshRBArray") + -ann "Create an active mesh rigid body array"`; + + setParent ..; + } + setParent ..; + } + + frameLayout -collapsable true -label "Passive Rigid Body Arrays" -borderStyle "in"; + { + rowLayout -nc 5; + { + string $createPassiveSphereRBArrayBtn = `iconTextButton -style "iconAndTextVertical" -label "Sphere" + -width 100 -image1 "dynamicaCreatePassiveSphereRBArray.xpm" -c ("dynamicaUI_createPassiveSphereRBArray") + -ann "Create an passive sphere rigid body array"`; + + string $createPassiveBoxRBArrayBtn = `iconTextButton -style "iconAndTextVertical" -label "Box" + -width 100 -image1 "dynamicaCreatePassiveBoxRBArray.xpm" -c ("dynamicaUI_createPassiveBoxRBArray") + -ann "Create an passive box rigid body array"`; + + string $createPassivePlaneRBArrayBtn = `iconTextButton -style "iconAndTextVertical" -label "Plane" + -width 100 -image1 "dynamicaCreatePassivePlaneRBArray.xpm" -c ("dynamicaUI_createPassivePlaneRBArray") + -ann "Create an passive plane rigid body array"`; + + string $createPassiveHullRBArrayBtn = `iconTextButton -style "iconAndTextVertical" -label "Hull" + -width 100 -image1 "dynamicaCreatePassiveHullRBArray.xpm" -c ("dynamicaUI_createPassiveHullRBArray") + -ann "Create an passive hull rigid body array"`; + + string $createPassiveMeshRBArrayBtn = `iconTextButton -style "iconAndTextVertical" -label "Mesh" + -width 100 -image1 "dynamicaCreatePassiveMeshRBArray.xpm" -c ("dynamicaUI_createPassiveMeshRBArray") + -ann "Create an passive mesh rigid body array"`; + + setParent ..; + } + setParent ..; + } + setParent ..; + } + return $mainForm; +} + +global proc dynamicaUI_STSolverTypeChanged() +{ + //create dSolver node if necessary + dSolver; + + global string $dynamicaUI_STsolverType; + int $type[] = `textScrollList -q -selectIndexedItem $dynamicaUI_STsolverType`; + $type[0] = $type[0] -1; //1-based + setAttr dSolver1.ssSolverType $type[0]; +} + +global proc dynamicaUI_STgravityChanged() +{ + //create dSolver node if necessary + dSolver; + + global string $dynamicaUI_STgravityX; + global string $dynamicaUI_STgravityY; + global string $dynamicaUI_STgravityZ; + + float $gx = `floatField -query -value $dynamicaUI_STgravityX`; + float $gy = `floatField -query -value $dynamicaUI_STgravityY`; + float $gz = `floatField -query -value $dynamicaUI_STgravityZ`; + + setAttr dSolver1.gravity -type double3 $gx $gy $gz; + +} + +global proc dynamicaUI_STenabledChanged() +{ + //create dSolver node if necessary + dSolver; + + global string $dynamicaUI_STenabled; + + int $enabled = `checkBox -query -value $dynamicaUI_STenabled`; + + setAttr dSolver1.enabled $enabled; + +} + +global proc dynamicaUI_STsplitImpulseChanged() +{ + //create dSolver node if necessary + dSolver; + + global string $dynamicaUI_STsplitImpulse; + + int $enabled = `checkBox -query -value $dynamicaUI_STsplitImpulse`; + + setAttr dSolver1.splitImpulse $enabled; + +} + +global proc dynamicaUI_STsubstepsChanged() +{ + //create dSolver node if necessary + dSolver; + + global string $dynamicaUI_STsubsteps; + + int $substeps = `intField -query -value $dynamicaUI_STsubsteps`; + + setAttr dSolver1.substeps $substeps; + +} + +proc dynamicaUI_createRigidBody(int $active, int $collisionShapeType) +{ + string $selection[] = `ls -selection -dag -leaf -showType -type "geometry"`; + + //create dSolver node if necessary + dSolver; + + string $rigidBodyNode = `dRigidBody`; + string $collisionShapeNode = `createNode dCollisionShape`; + connectAttr ($collisionShapeNode + ".outCollisionShape") ($rigidBodyNode + ".inCollisionShape"); + string $rigidBodyTransforms[] = `listRelatives -parent $rigidBodyNode`; + + if(size($selection) != 0) { + string $shapeTransforms[] = `listRelatives -parent $selection[0]`; + if($selection[1] == "mesh") { + connectAttr ($selection[0] + ".message") ($collisionShapeNode + ".inShape"); + hide $shapeTransforms[0]; + } + //pick the selected object's transform only if we are creating a hull or a mesh + if($collisionShapeType == 0 || $collisionShapeType == 1) { + float $pos[]= `getAttr ($shapeTransforms[0] + ".translate")`; + float $rot[]= `getAttr ($shapeTransforms[0] + ".rotate")`; + + setAttr ($rigidBodyTransforms[0] + ".translate") -type double3 $pos[0] $pos[1] $pos[2]; + //setAttr ($rigidBodyNode + ".initialPosition") -type double3 $pos[0] $pos[1] $pos[2]; + + setAttr ($rigidBodyTransforms[0] + ".rotate") -type double3 $rot[0] $rot[1] $rot[2]; + // setAttr ($rigidBodyNode + ".initialRotation") -type double3 $rot[0] $rot[1] $rot[2]; + } + } + + setAttr ($rigidBodyNode + ".active" ) $active; + setAttr ($collisionShapeNode + ".type" ) $collisionShapeType; + + select -r $rigidBodyTransforms[0]; +} + +global proc dynamicaUI_createArrayUIdismissCB(string $button) +{ + global string $dynamicaUI_createArrayUI_sizeCT; + global string $dynamicaUI_createArrayUI_offsetCT; + + global int $dynamicaUI_createArrayUI_size[]; + global float $dynamicaUI_createArrayUI_offset[]; + + $dynamicaUI_createArrayUI_size = `intFieldGrp -query -value $dynamicaUI_createArrayUI_sizeCT`; + $dynamicaUI_createArrayUI_offset = `floatFieldGrp -query -value $dynamicaUI_createArrayUI_offsetCT`; + layoutDialog -dismiss $button; +} + +global proc dynamicaUI_createArrayUI() +{ + global string $dynamicaUI_createArrayUI_sizeCT; + global string $dynamicaUI_createArrayUI_offsetCT; + + // Get the dialog's formLayout. + string $form = `setParent -q`; + + // layoutDialog's are not resizable, so hard code a size here, + // to make sure all UI elements are visible. + formLayout -e -width 350 $form; + + string $b1 = `button -l "OK" -c "dynamicaUI_createArrayUIdismissCB(\"OK\")"`; + string $b2 = `button -l "Cancel"-c "dynamicaUI_createArrayUIdismissCB(\"Cancel\")"`; + + $dynamicaUI_createArrayUI_sizeCT = `intFieldGrp -columnAlign 1 "left" -adj 1 -numberOfFields 3 -label "Array Size" -v1 1 -v2 1 -v3 1`; + $dynamicaUI_createArrayUI_offsetCT = `floatFieldGrp -columnAlign 1 "left" -adj 1 -numberOfFields 3 -label "Array Offset" -v1 2.0 -v2 2.0 -v3 2.0`; + + formLayout -edit + -attachForm $dynamicaUI_createArrayUI_sizeCT "top" 5 + -attachForm $dynamicaUI_createArrayUI_sizeCT "left" 5 + -attachNone $dynamicaUI_createArrayUI_sizeCT "bottom" + -attachForm $dynamicaUI_createArrayUI_sizeCT "right" 5 + + -attachControl $dynamicaUI_createArrayUI_offsetCT "top" 5 $dynamicaUI_createArrayUI_sizeCT + -attachForm $dynamicaUI_createArrayUI_offsetCT "left" 5 + -attachNone $dynamicaUI_createArrayUI_offsetCT "bottom" + -attachForm $dynamicaUI_createArrayUI_offsetCT "right" 5 + + -attachControl $b1 "top" 5 $dynamicaUI_createArrayUI_offsetCT + -attachForm $b1 "left" 5 + -attachNone $b1 "bottom" + -attachPosition $b1 "right" 5 33 + + -attachControl $b2 "top" 5 $dynamicaUI_createArrayUI_offsetCT + -attachPosition $b2 "left" 5 33 + -attachNone $b2 "bottom" + -attachPosition $b2 "right" 5 66 + + $form; +} + +global proc dynamicaUI_createActiveRigidBody() +{ + dynamicaUI_createRigidBody(true, 0); +} + +global proc dynamicaUI_createPassiveRigidBody() +{ + dynamicaUI_createRigidBody(false, 0); +} + +global proc dynamicaUI_createActiveSphereRB() +{ + dynamicaUI_createRigidBody(true, 5); +} + +global proc dynamicaUI_createActiveBoxRB() +{ + dynamicaUI_createRigidBody(true, 4); +} + +global proc dynamicaUI_createActivePlaneRB() +{ + dynamicaUI_createRigidBody(true, 6); +} + +global proc dynamicaUI_createActiveHullRB() +{ + dynamicaUI_createRigidBody(true, 0); +} + +global proc dynamicaUI_createActiveMeshRB() +{ + dynamicaUI_createRigidBody(true, 1); +} + +global proc dynamicaUI_createPassiveSphereRB() +{ + dynamicaUI_createRigidBody(false, 5); +} + +global proc dynamicaUI_createPassiveBoxRB() +{ + dynamicaUI_createRigidBody(false, 4); +} + +global proc dynamicaUI_createPassivePlaneRB() +{ + dynamicaUI_createRigidBody(false, 6); +} + +global proc dynamicaUI_createPassiveHullRB() +{ + dynamicaUI_createRigidBody(false, 0); +} + +global proc dynamicaUI_createPassiveMeshRB() +{ + dynamicaUI_createRigidBody(false, 1); +} + +proc dynamicaUI_createRigidBodyArray(int $active, int $collisionShapeType) +{ + global int $dynamicaUI_createArrayUI_size[]; + global float $dynamicaUI_createArrayUI_offset[]; + + if(`layoutDialog -title "Create Rigid Body Array" -ui "dynamicaUI_createArrayUI"` == "OK") { + string $selection[] = `ls -selection -dag -leaf -showType -type "geometry"`; + + //create dSolver node if necessary + dSolver; + + string $rigidBodyArrayNode = `dRigidBodyArray`; + string $collisionShapeNode = `createNode dCollisionShape`; + connectAttr ($collisionShapeNode + ".outCollisionShape") ($rigidBodyArrayNode + ".inCollisionShape"); + string $rigidBodyTransforms[] = `listRelatives -parent $rigidBodyArrayNode`; + + if(size($selection) != 0) { + string $shapeTransforms[] = `listRelatives -parent $selection[0]`; + if($selection[1] == "mesh") { + connectAttr ($selection[0] + ".message") ($collisionShapeNode + ".inShape"); + hide $shapeTransforms[0]; + } + } + + setAttr ($rigidBodyArrayNode + ".active" ) $active; + setAttr ($collisionShapeNode + ".type" ) $collisionShapeType; + + select -r $rigidBodyTransforms[0]; + + int $size[]= $dynamicaUI_createArrayUI_size; + float $off[]= $dynamicaUI_createArrayUI_offset; + float $x0[]; + $x0[0] = -0.5 * $size[0] * $off[0]; + $x0[1] = -0.5 * $size[1] * $off[1]; + $x0[2] = -0.5 * $size[2] * $off[2]; + setAttr ($rigidBodyArrayNode + ".numBodies") ($size[0] * $size[1] * $size[2]); + for($i = 0; $i < $size[0]; $i++) { + for($j = 0; $j < $size[1]; $j++) { + for($k = 0; $k < $size[2]; $k++) { + setAttr ($rigidBodyArrayNode + ".initialPosition[" + string($i + $size[0] * $j + $size[0] * $size[1] * $k) + "]") ($x0[0] + $i * $off[0]) ($x0[1] + $j * $off[1]) ($x0[2] + $k * $off[2]); + } + } + } + } +} + +global proc dynamicaUI_createActiveSphereRBArray() +{ + dynamicaUI_createRigidBodyArray(true, 5); +} + +global proc dynamicaUI_createActiveBoxRBArray() +{ + dynamicaUI_createRigidBodyArray(true, 4); +} + +global proc dynamicaUI_createActivePlaneRBArray() +{ + dynamicaUI_createRigidBodyArray(true, 6); +} + +global proc dynamicaUI_createActiveHullRBArray() +{ + dynamicaUI_createRigidBodyArray(true, 0); +} + +global proc dynamicaUI_createActiveMeshRBArray() +{ + dynamicaUI_createRigidBodyArray(true, 1); +} + +global proc dynamicaUI_createPassiveSphereRBArray() +{ + dynamicaUI_createRigidBodyArray(false, 5); +} + +global proc dynamicaUI_createPassiveBoxRBArray() +{ + dynamicaUI_createRigidBodyArray(false, 4); +} + +global proc dynamicaUI_createPassivePlaneRBArray() +{ + dynamicaUI_createRigidBodyArray(false, 6); +} + +global proc dynamicaUI_createPassiveHullRBArray() +{ + dynamicaUI_createRigidBodyArray(false, 0); +} + +global proc dynamicaUI_createPassiveMeshRBArray() +{ + dynamicaUI_createRigidBodyArray(false, 1); +} + +global proc dyn_demo1() +{ + dynamicaUI_createActiveSphereRBArray(); + string $children[] = `listRelatives -shapes`; + setAttr ($children[0] + ".numBodies") 1000; + for($i = 0; $i < 10; $i++) { + for($j = 0; $j < 10; $j++) { + for($k = 0; $k < 10; $k++) { + setAttr ($children[0] + ".initialPosition[" + string($i + 10 * $j + 100 * $k) + "]") ($i * 2) (10 + $k * 2) ($j * 2); + } + } + } +} diff --git a/Extras/MayaPlugin/shared_ptr.h b/Extras/MayaPlugin/shared_ptr.h new file mode 100644 index 000000000..1409ac3e3 --- /dev/null +++ b/Extras/MayaPlugin/shared_ptr.h @@ -0,0 +1,200 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//shared_ptr.h + +#ifndef DYN_SHARED_PTR_H +#define DYN_SHARED_PTR_H + +#define DYN_SHARED_PTR_THREAD_SAFE + +#ifdef WIN32 + +#include + +class shared_count { +public: + shared_count(): m_count(1) { } + ~shared_count() { } + + long increment() + { +#ifdef DYN_SHARED_PTR_THREAD_SAFE + return InterlockedIncrement(&m_count); +#else + return ++m_count; +#endif + } + + long decrement() { +#ifdef DYN_SHARED_PTR_THREAD_SAFE + return InterlockedDecrement(&m_count); +#else + return ++m_count; +#endif + return c; + } + + long use_count() { return m_count; } + +private: + long m_count; +}; + +#else //ifdef WIN32 + +#include + +class shared_count { +public: + shared_count(): m_count(1) { +#ifdef DYN_SHARED_PTR_THREAD_SAFE + pthread_mutex_init(&m_mutex, 0); +#endif + } + ~shared_count() { +#ifdef DYN_SHARED_PTR_THREAD_SAFE + pthread_mutex_destroy(&m_mutex); +#endif + } + + long increment() + { +#ifdef DYN_SHARED_PTR_THREAD_SAFE + pthread_mutex_lock(&m_mutex); +#endif + long c = ++m_count; +#ifdef DYN_SHARED_PTR_THREAD_SAFE + pthread_mutex_unlock(&m_mutex); +#endif + return c; + } + + long decrement() { +#ifdef DYN_SHARED_PTR_THREAD_SAFE + pthread_mutex_lock(&m_mutex); +#endif + long c = --m_count; +#ifdef DYN_SHARED_PTR_THREAD_SAFE + pthread_mutex_unlock(&m_mutex); +#endif + return c; + } + + long use_count() { return m_count; } + +private: + long m_count; + mutable pthread_mutex_t m_mutex; +}; + +#endif + +template +class shared_ptr +{ +public: + shared_ptr(): m_ptr(NULL), m_count(NULL) { } + shared_ptr(shared_ptr const& other): + m_ptr(other.m_ptr), + m_count(other.m_count) + { + if(other.m_count != NULL) other.m_count->increment(); + } + + template + shared_ptr(shared_ptr const& other): + m_ptr(other.m_ptr), + m_count(other.m_count) + { + if(other.m_count != NULL) other.m_count->increment(); + } + + shared_ptr(T const* other): m_ptr(const_cast(other)), m_count(NULL) + { + if(other != NULL) m_count = new shared_count; + } + + ~shared_ptr() + { + giveup_ownership(); + } + + void reset(T const* other) + { + if(m_ptr == other) return; + giveup_ownership(); + m_ptr = const_cast(other); + if(other != NULL) m_count = new shared_count; + else m_count = NULL; + } + + T* get() { return m_ptr; } + T const* get() const { return m_ptr; } + T* operator->() { return m_ptr; } + T const* operator->() const { return m_ptr; } + operator bool() { return m_ptr != NULL; } + + bool operator<(shared_ptr const& rhs) const { return m_ptr < rhs.m_ptr; } + + shared_ptr& operator=(shared_ptr const& other) { + if(m_ptr == other.m_ptr) return *this; + giveup_ownership(); + m_ptr = other.m_ptr; + m_count = other.m_count; + if(other.m_count != NULL) m_count->increment(); + return *this; + } + + template + shared_ptr& operator=(shared_ptr& other) { + if(m_ptr == other.m_ptr) return *this; + giveup_ownership(); + m_ptr = other.m_ptr; + m_count = other.m_count; + if(other.m_count != NULL) m_count->increment(); + return *this; + } + +protected: + + template friend class shared_ptr; + void giveup_ownership() + { + if(m_count != NULL) { + if( m_count->decrement() == 0) { + delete m_ptr; + m_ptr = NULL; + delete m_count; + m_count = NULL; + } + } + } + +protected: + T *m_ptr; + shared_count *m_count; + +}; + + +#endif diff --git a/Extras/MayaPlugin/solver.cpp b/Extras/MayaPlugin/solver.cpp new file mode 100644 index 000000000..23c949432 --- /dev/null +++ b/Extras/MayaPlugin/solver.cpp @@ -0,0 +1,124 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//solver.cpp + +#include "solver.h" +#include "bt_solver.h" + +shared_ptr solver_t::m_impl; +std::set solver_t::m_rigid_bodies; + + +void solver_t::initialize() +{ + m_impl.reset(new bt_solver_t); +} + +void solver_t::cleanup() +{ + +} + +//creation methods +sphere_shape_t::pointer solver_t::create_sphere_shape(float radius) +{ + return sphere_shape_t::pointer(new sphere_shape_t(m_impl->create_sphere_shape(radius))); +} + +plane_shape_t::pointer solver_t::create_plane_shape(vec3f const& normal, float d) +{ + return plane_shape_t::pointer(new plane_shape_t(m_impl->create_plane_shape(normal, d))); +} + +box_shape_t::pointer solver_t::create_box_shape(vec3f const& halfExtents) +{ + return box_shape_t::pointer(new box_shape_t(m_impl->create_box_shape(halfExtents))); +} + +convex_hull_shape_t::pointer solver_t::create_convex_hull_shape(vec3f const* vertices, size_t num_vertices, + vec3f const* normals, + unsigned int const *indices, size_t num_indices) +{ + return convex_hull_shape_t::pointer(new convex_hull_shape_t(m_impl->create_convex_hull_shape(vertices, num_vertices, + normals, + indices, num_indices))); +} + +mesh_shape_t::pointer solver_t::create_mesh_shape(vec3f const* vertices, size_t num_vertices, + vec3f const* normals, + unsigned int const *indices, size_t num_indices) +{ + return mesh_shape_t::pointer(new mesh_shape_t(m_impl->create_mesh_shape(vertices, num_vertices, + normals, + indices, num_indices))); +} + +rigid_body_t::pointer solver_t::create_rigid_body(collision_shape_t::pointer& cs) +{ + return rigid_body_t::pointer(new rigid_body_t(m_impl->create_rigid_body(cs->impl()), cs)); +} + +//add/remove from world +void solver_t::add_rigid_body(rigid_body_t::pointer& rb) +{ + if(rb) { + if(m_rigid_bodies.find(rb) == m_rigid_bodies.end()) { + m_rigid_bodies.insert(rb); + m_impl->add_rigid_body(rb->impl()); + } + } +} + +void solver_t::remove_rigid_body(rigid_body_t::pointer& rb) +{ + if(rb) { + if(m_rigid_bodies.find(rb) != m_rigid_bodies.end()) { + m_impl->remove_rigid_body(rb->impl()); + m_rigid_bodies.erase(rb); + } + } +} + +void solver_t::remove_all_rigid_bodies() +{ + std::set::iterator it; + for(it = m_rigid_bodies.begin(); it != m_rigid_bodies.end(); ++it) { + m_impl->remove_rigid_body(const_cast((*it).get())->impl()); + } + m_rigid_bodies.clear(); +} + +void solver_t::set_gravity(vec3f const& g) +{ + m_impl->set_gravity(g); +} + +void solver_t::set_split_impulse(bool enabled) +{ + m_impl->set_split_impulse(enabled); +} + +void solver_t::step_simulation(float dt) +{ + m_impl->step_simulation(dt); +} diff --git a/Extras/MayaPlugin/solver.h b/Extras/MayaPlugin/solver.h new file mode 100644 index 000000000..dd6dfacbb --- /dev/null +++ b/Extras/MayaPlugin/solver.h @@ -0,0 +1,88 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//solver.h + +//basic class for all solvers + +#ifndef DYN_SOLVER_H +#define DYN_SOLVER_H + +#include + +#include "mathUtils.h" +#include "shared_ptr.h" + +#include "rigid_body.h" +#include "sphere_shape.h" +#include "plane_shape.h" +#include "box_shape.h" +#include "convex_hull_shape.h" +#include "mesh_shape.h" +#include "solver_impl.h" + +class solver_t +{ +public: + static void initialize(); + static void cleanup(); + + //creation methods + static sphere_shape_t::pointer create_sphere_shape(float radius = 1.0); + + static plane_shape_t::pointer create_plane_shape(vec3f const& normal = vec3f(0, 1, 0), float d = 0); + + static box_shape_t::pointer create_box_shape(vec3f const& halfExtents = vec3f(0.5f, 0.5f, 0.5f)); + + static convex_hull_shape_t::pointer create_convex_hull_shape(vec3f const* vertices, size_t num_vertices, + vec3f const* normals, + unsigned int const *indices, size_t num_indices); + + static mesh_shape_t::pointer create_mesh_shape(vec3f const* vertices, size_t num_vertices, + vec3f const* normals, + unsigned int const *indices, size_t num_indices); + + static rigid_body_t::pointer create_rigid_body(collision_shape_t::pointer& cs); + + //add/remove from world + static void add_rigid_body(rigid_body_t::pointer& rb); + static void remove_rigid_body(rigid_body_t::pointer& rb); + static void remove_all_rigid_bodies(); + + // + static void set_gravity(vec3f const& g); + + // + static void set_split_impulse(bool enabled); + + // + static void step_simulation(float dt); + +private: + static shared_ptr m_impl; + static std::set m_rigid_bodies; +}; + + + +#endif + diff --git a/Extras/MayaPlugin/solver_impl.h b/Extras/MayaPlugin/solver_impl.h new file mode 100644 index 000000000..39e3c04dc --- /dev/null +++ b/Extras/MayaPlugin/solver_impl.h @@ -0,0 +1,65 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//solver_impl.h + +#ifndef DYN_SOLVER_IMPL_H +#define DYN_SOLVER_IMPL_H + +#include "rigid_body_impl.h" +#include "collision_shape_impl.h" + +class solver_impl_t +{ +public: + virtual collision_shape_impl_t* create_sphere_shape(float radius) = 0; + + virtual collision_shape_impl_t* create_plane_shape(vec3f const& normal, float d) = 0; + + virtual collision_shape_impl_t* create_box_shape(vec3f const& halfExtents) = 0; + + virtual collision_shape_impl_t* create_convex_hull_shape(vec3f const* vertices, size_t num_vertices, + vec3f const* normals, + unsigned int const *indices, size_t num_indices) = 0; + + virtual collision_shape_impl_t* create_mesh_shape(vec3f const* vertices, size_t num_vertices, + vec3f const* normals, + unsigned int const *indices, size_t num_indices) = 0; + + virtual rigid_body_impl_t* create_rigid_body(collision_shape_impl_t* cs) = 0; + + virtual void add_rigid_body(rigid_body_impl_t* rb) = 0; + + virtual void remove_rigid_body(rigid_body_impl_t* rb) = 0; + + virtual void set_gravity(vec3f const& g) = 0; + + virtual void set_split_impulse(bool enabled) = 0; + + virtual void step_simulation(float dt) = 0; + +public: + virtual ~solver_impl_t() { } +}; + +#endif + diff --git a/Extras/MayaPlugin/sphere_shape.h b/Extras/MayaPlugin/sphere_shape.h new file mode 100644 index 000000000..3266e6502 --- /dev/null +++ b/Extras/MayaPlugin/sphere_shape.h @@ -0,0 +1,45 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//sphere_shape.h + +#ifndef DYN_SPHERE_SHAPE_H +#define DYN_SPHERE_SHAPE_H + +#include "collision_shape.h" +#include "sphere_shape_impl.h" + +class sphere_shape_t: public collision_shape_t +{ +public: + //typedefs + typedef shared_ptr pointer; + + +protected: + friend class solver_t; + + sphere_shape_t(collision_shape_impl_t* impl): collision_shape_t(impl) { } + +}; + +#endif diff --git a/Extras/MayaPlugin/sphere_shape_impl.h b/Extras/MayaPlugin/sphere_shape_impl.h new file mode 100644 index 000000000..753018343 --- /dev/null +++ b/Extras/MayaPlugin/sphere_shape_impl.h @@ -0,0 +1,38 @@ +/* +Bullet Continuous Collision Detection and Physics Library Maya Plugin +Copyright (c) 2008 Walt Disney Studios + +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. + +Written by: Nicola Candussi +*/ + +//sphere_shape_impl.h + +#ifndef DYN_SPHERE_SHAPE_IMPL_H +#define DYN_SPHERE_SHAPE_IMPL_H + +#include "collision_shape_impl.h" + +class sphere_shape_impl_t: public collision_shape_impl_t +{ +public: + +private: + +}; + +#endif