diff --git a/Demos/CMakeLists.txt b/Demos/CMakeLists.txt index 22d04b0b0..e578a4b8b 100644 --- a/Demos/CMakeLists.txt +++ b/Demos/CMakeLists.txt @@ -2,11 +2,11 @@ if (CMAKE_SIZEOF_VOID_P MATCHES "8") SUBDIRS( OpenGL AllBulletDemos ConvexDecompositionDemo Benchmarks HelloWorld CcdPhysicsDemo ConstraintDemo SliderConstraintDemo GenericJointDemo RagdollDemo ForkLiftDemo BasicDemo BspDemo MovingConcaveDemo VehicleDemo -ColladaDemo UserCollisionAlgorithm CharacterDemo SoftDemo TerrainDemo ) +ColladaDemo UserCollisionAlgorithm CharacterDemo SoftDemo TerrainDemo HeightFieldFluidDemo) else (CMAKE_SIZEOF_VOID_P MATCHES "8") SUBDIRS( OpenGL AllBulletDemos ConvexDecompositionDemo Benchmarks HelloWorld MultiThreadedDemo CcdPhysicsDemo ConstraintDemo SliderConstraintDemo GenericJointDemo RagdollDemo ForkLiftDemo BasicDemo BspDemo MovingConcaveDemo VehicleDemo ColladaDemo UserCollisionAlgorithm CharacterDemo SoftDemo -TerrainDemo ) +TerrainDemo HeightFieldFluidDemo) endif (CMAKE_SIZEOF_VOID_P MATCHES "8") diff --git a/Demos/CollisionDemo/CollisionDemo.cpp b/Demos/CollisionDemo/CollisionDemo.cpp index 8480c3c97..c98524360 100644 --- a/Demos/CollisionDemo/CollisionDemo.cpp +++ b/Demos/CollisionDemo/CollisionDemo.cpp @@ -235,7 +235,7 @@ void CollisionDemo::displayCallback(void) { tr[i].getOpenGLMatrix( m ); - m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); } @@ -251,7 +251,7 @@ void CollisionDemo::displayCallback(void) { btTransform ident; ident.setIdentity(); ident.getOpenGLMatrix(m); - m_shapeDrawer.drawOpenGL(m,&simplex,btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL(m,&simplex,btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); btQuaternion orn; diff --git a/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.cpp b/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.cpp index a660d6e34..584d2eba8 100644 --- a/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.cpp +++ b/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.cpp @@ -163,7 +163,7 @@ void CollisionInterfaceDemo::displayCallback(void) { { objects[i].getWorldTransform().getOpenGLMatrix( m ); - m_shapeDrawer.drawOpenGL(m,objects[i].getCollisionShape(),btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL(m,objects[i].getCollisionShape(),btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); } diff --git a/Demos/ContinuousConvexCollision/ContinuousConvexCollisionDemo.cpp b/Demos/ContinuousConvexCollision/ContinuousConvexCollisionDemo.cpp index 3bc8fbbd5..350a3ad5a 100644 --- a/Demos/ContinuousConvexCollision/ContinuousConvexCollisionDemo.cpp +++ b/Demos/ContinuousConvexCollision/ContinuousConvexCollisionDemo.cpp @@ -179,7 +179,7 @@ void btContinuousConvexCollisionDemo::displayCallback(void) { //m_shapeDrawer.drawOpenGL(m,shapePtr[i]); interpolatedTrans.getOpenGLMatrix( m ); - m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(1,0,1),getDebugMode(),worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL(m,shapePtr[i],btVector3(1,0,1),getDebugMode(),worldBoundsMin,worldBoundsMax); } } } @@ -231,10 +231,10 @@ void btContinuousConvexCollisionDemo::displayCallback(void) { for (i=0;idrawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); } - btDebugCastResult rayResult1(fromTrans[0],shapePtr[0],linVels[0],angVels[0],&m_shapeDrawer); + btDebugCastResult rayResult1(fromTrans[0],shapePtr[0],linVels[0],angVels[0],m_shapeDrawer); for (i=1;im_fraction,hitTrans); hitTrans.getOpenGLMatrix(m); - m_shapeDrawer.drawOpenGL(m,shapePtr[0],btVector3(0,1,0),getDebugMode(),worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL(m,shapePtr[0],btVector3(0,1,0),getDebugMode(),worldBoundsMin,worldBoundsMax); btTransformUtil::integrateTransform(fromTrans[i],linVels[i],angVels[i],rayResultPtr->m_fraction,hitTrans); hitTrans.getOpenGLMatrix(m); - m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(0,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL(m,shapePtr[i],btVector3(0,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); } diff --git a/Demos/DoublePrecisionDemo/DoublePrecisionDemo.cpp b/Demos/DoublePrecisionDemo/DoublePrecisionDemo.cpp index 2b869e74c..38f96ad7d 100644 --- a/Demos/DoublePrecisionDemo/DoublePrecisionDemo.cpp +++ b/Demos/DoublePrecisionDemo/DoublePrecisionDemo.cpp @@ -1,278 +1,278 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ - -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. -*/ - - -/// -/// DoublePrecisionDemo shows high level usage of the Collision Detection. -/// - -#include "GL_Simplex1to4.h" - -//include common Bullet Collision Detection headerfiles -#include "btBulletCollisionCommon.h" - -#include "LinearMath/btIDebugDraw.h" -#include "BMF_Api.h" -#include "GL_ShapeDrawer.h" -#include "DoublePrecisionDemo.h" -#include "GlutStuff.h" -#include "GLDebugDrawer.h" - -btScalar yaw=btScalar(0.); -btScalar pitch=btScalar(0.); -btScalar roll=btScalar(0.); -const int maxNumObjects = 4; -const int numObjects = 2; - -GL_Simplex1to4 simplex; - - -btCollisionObject objects[maxNumObjects]; -btCollisionWorld* collisionWorld = 0; - -// so pixel ratio is 1:1 -int screenWidth = 640; -int screenHeight = 640; -GLDebugDrawer debugDrawer; - -const btScalar LARGE_DISTANCE_FROM_ORIGIN = btScalar(999999.0); -const btScalar VERY_SMALL_INCREMENT = btScalar(0.000009); - -int main(int argc,char** argv) -{ - DoublePrecisionDemo* doublePrecisionDemo = new DoublePrecisionDemo(); - - doublePrecisionDemo->initPhysics(); - doublePrecisionDemo->setCameraDistance(btScalar(2.0)); - - doublePrecisionDemo->clientResetScene(); - - return glutmain(argc, argv,screenWidth,screenHeight,"Double Precision Demo",doublePrecisionDemo); -} - -void DoublePrecisionDemo::initPhysics() -{ - m_debugMode |= btIDebugDraw::DBG_DrawWireframe; - - btMatrix3x3 basisA; - basisA.setIdentity(); - - btMatrix3x3 basisB; - basisB.setIdentity(); - - objects[0].getWorldTransform().setBasis(basisA); - objects[1].getWorldTransform().setBasis(basisB); - - - btBoxShape* boxA = new btBoxShape(btVector3(0.5,0.5,0.5)); - btBoxShape* boxB = new btBoxShape(btVector3(0.5,0.5,0.5)); - - objects[0].setCollisionShape(boxA);//&hullA; - objects[1].setCollisionShape(boxB);//&hullB; - - btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); - btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); - btVector3 worldAabbMin(80000,80000,80000); - btVector3 worldAabbMax(120000,120000,120000); - - btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax); - - collisionWorld = new btCollisionWorld(dispatcher,broadphase,collisionConfiguration); - - collisionWorld->addCollisionObject(&objects[0]); - collisionWorld->addCollisionObject(&objects[1]); - -} - - -//to be implemented by the demo - -void DoublePrecisionDemo::clientMoveAndDisplay() -{ - - displayCallback(); -} - - -static btVoronoiSimplexSolver sGjkSimplexSolver; -btSimplexSolverInterface& gGjkSimplexSolver = sGjkSimplexSolver; - -void DoublePrecisionDemo::displayCallback(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glDisable(GL_LIGHTING); - - collisionWorld->getDispatchInfo().m_debugDraw = &debugDrawer; - - if (collisionWorld) - collisionWorld->performDiscreteCollisionDetection(); - - int i; - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +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. +*/ + + +/// +/// DoublePrecisionDemo shows high level usage of the Collision Detection. +/// + +#include "GL_Simplex1to4.h" + +//include common Bullet Collision Detection headerfiles +#include "btBulletCollisionCommon.h" + +#include "LinearMath/btIDebugDraw.h" +#include "BMF_Api.h" +#include "GL_ShapeDrawer.h" +#include "DoublePrecisionDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" + +btScalar yaw=btScalar(0.); +btScalar pitch=btScalar(0.); +btScalar roll=btScalar(0.); +const int maxNumObjects = 4; +const int numObjects = 2; + +GL_Simplex1to4 simplex; + + +btCollisionObject objects[maxNumObjects]; +btCollisionWorld* collisionWorld = 0; + +// so pixel ratio is 1:1 +int screenWidth = 640; +int screenHeight = 640; +GLDebugDrawer debugDrawer; + +const btScalar LARGE_DISTANCE_FROM_ORIGIN = btScalar(999999.0); +const btScalar VERY_SMALL_INCREMENT = btScalar(0.000009); + +int main(int argc,char** argv) +{ + DoublePrecisionDemo* doublePrecisionDemo = new DoublePrecisionDemo(); + + doublePrecisionDemo->initPhysics(); + doublePrecisionDemo->setCameraDistance(btScalar(2.0)); + + doublePrecisionDemo->clientResetScene(); + + return glutmain(argc, argv,screenWidth,screenHeight,"Double Precision Demo",doublePrecisionDemo); +} + +void DoublePrecisionDemo::initPhysics() +{ + m_debugMode |= btIDebugDraw::DBG_DrawWireframe; + + btMatrix3x3 basisA; + basisA.setIdentity(); + + btMatrix3x3 basisB; + basisB.setIdentity(); + + objects[0].getWorldTransform().setBasis(basisA); + objects[1].getWorldTransform().setBasis(basisB); + + + btBoxShape* boxA = new btBoxShape(btVector3(0.5,0.5,0.5)); + btBoxShape* boxB = new btBoxShape(btVector3(0.5,0.5,0.5)); + + objects[0].setCollisionShape(boxA);//&hullA; + objects[1].setCollisionShape(boxB);//&hullB; + + btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); + btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); + btVector3 worldAabbMin(80000,80000,80000); + btVector3 worldAabbMax(120000,120000,120000); + + btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax); + + collisionWorld = new btCollisionWorld(dispatcher,broadphase,collisionConfiguration); + + collisionWorld->addCollisionObject(&objects[0]); + collisionWorld->addCollisionObject(&objects[1]); + +} + + +//to be implemented by the demo + +void DoublePrecisionDemo::clientMoveAndDisplay() +{ + + displayCallback(); +} + + +static btVoronoiSimplexSolver sGjkSimplexSolver; +btSimplexSolverInterface& gGjkSimplexSolver = sGjkSimplexSolver; + +void DoublePrecisionDemo::displayCallback(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glDisable(GL_LIGHTING); + + collisionWorld->getDispatchInfo().m_debugDraw = &debugDrawer; + + if (collisionWorld) + collisionWorld->performDiscreteCollisionDetection(); + + int i; + btVector3 worldBoundsMin,worldBoundsMax; collisionWorld->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); - - - ///one way to draw all the contact points is iterating over contact manifolds / points: - int numManifolds = collisionWorld->getDispatcher()->getNumManifolds(); - for (i=0;igetDispatcher()->getManifoldByIndexInternal(i); - btCollisionObject* obA = static_cast(contactManifold->getBody0()); - btCollisionObject* obB = static_cast(contactManifold->getBody1()); - contactManifold->refreshContactPoints(obA->getWorldTransform(),obB->getWorldTransform()); - - int numContacts = contactManifold->getNumContacts(); - for (int j=0;jgetContactPoint(j); - - glBegin(GL_LINES); - glColor3f(1, 1, 1); - - btVector3 ptA = pt.getPositionWorldOnA() - m_cameraPosition; - btVector3 ptB = pt.getPositionWorldOnB() - m_cameraPosition; - - glVertex3d(ptA.x(),ptA.y(),ptA.z()); - glVertex3d(ptB.x(),ptB.y(),ptB.z()); - glEnd(); - } - - //you can un-comment out this line, and then all points are removed - //contactManifold->clearManifold(); - } - - btScalar m[16]; - btTransform temp; - - - btVector3 color; - //int i; - for (i=0;igetDispatcher()->getNumManifolds(); + for (i=0;igetDispatcher()->getManifoldByIndexInternal(i); + btCollisionObject* obA = static_cast(contactManifold->getBody0()); + btCollisionObject* obB = static_cast(contactManifold->getBody1()); + contactManifold->refreshContactPoints(obA->getWorldTransform(),obB->getWorldTransform()); + + int numContacts = contactManifold->getNumContacts(); + for (int j=0;jgetContactPoint(j); + + glBegin(GL_LINES); + glColor3f(1, 1, 1); + + btVector3 ptA = pt.getPositionWorldOnA() - m_cameraPosition; + btVector3 ptB = pt.getPositionWorldOnB() - m_cameraPosition; + + glVertex3d(ptA.x(),ptA.y(),ptA.z()); + glVertex3d(ptB.x(),ptB.y(),ptB.z()); + glEnd(); + } + + //you can un-comment out this line, and then all points are removed + //contactManifold->clearManifold(); + } + + btScalar m[16]; + btTransform temp; + + + btVector3 color; + //int i; + for (i=0;idrawOpenGL(m,objects[i].getCollisionShape(),color,getDebugMode(),worldBoundsMin,worldBoundsMax); + } + + objects[1].getWorldTransform().setOrigin(objects[1].getWorldTransform().getOrigin()+btVector3(-VERY_SMALL_INCREMENT,-VERY_SMALL_INCREMENT,0)); + objects[0].getWorldTransform().setOrigin(objects[0].getWorldTransform().getOrigin()+btVector3(VERY_SMALL_INCREMENT,VERY_SMALL_INCREMENT,0)); + + float yStart = 20.f; + float yIncr = 20.f; + char buf[124]; + + glColor3f(0, 0, 0); + + setOrthographicProjection(); + + glRasterPos3f(10.0f,yStart,0); + #ifdef BT_USE_DOUBLE_PRECISION + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),"Double Precision Mode"); + #else + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),"Single Precision Mode"); + #endif + yStart += yIncr; + + glRasterPos3f(10.0f,yStart,0); + sprintf(buf,"Movement distance in x and y axis = %lf", VERY_SMALL_INCREMENT); + + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(10.0f,yStart,0); + btScalar xValue = objects[0].getWorldTransform().getOrigin().x(); + btScalar yValue = objects[0].getWorldTransform().getOrigin().y(); + btScalar zValue = objects[0].getWorldTransform().getOrigin().z(); + sprintf(buf,"Cube 0 location = ( %lf, %lf, %lf )", xValue, yValue, zValue); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + xValue = objects[1].getWorldTransform().getOrigin().x(); + yValue = objects[1].getWorldTransform().getOrigin().y(); + zValue = objects[1].getWorldTransform().getOrigin().z(); + glRasterPos3f(10.0f,yStart,0); + sprintf(buf,"Cube 1 location = ( %lf, %lf, %lf )", xValue, yValue, zValue); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(10.0f,yStart,0); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),"w=toggle wireframe/solid"); + + resetPerspectiveProjection(); + + glFlush(); + glutSwapBuffers(); +} + +void DoublePrecisionDemo::clientResetScene() +{ + objects[0].getWorldTransform().setOrigin(btVector3(LARGE_DISTANCE_FROM_ORIGIN,LARGE_DISTANCE_FROM_ORIGIN,LARGE_DISTANCE_FROM_ORIGIN)); + objects[1].getWorldTransform().setOrigin(btVector3(LARGE_DISTANCE_FROM_ORIGIN-VERY_SMALL_INCREMENT,LARGE_DISTANCE_FROM_ORIGIN-VERY_SMALL_INCREMENT,LARGE_DISTANCE_FROM_ORIGIN)); +} + + + +void DoublePrecisionDemo::updateCamera() +{ + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + // look at the stationary cube + m_cameraTargetPosition = objects[0].getWorldTransform().getOrigin(); + + m_cameraPosition = m_cameraTargetPosition; + m_cameraPosition[2] = m_cameraTargetPosition[2] - m_cameraDistance; + + //update OpenGL camera settings + glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10000.0); + + // To not loose precision in the rendering process, we shift the object to the origin + gluLookAt(0.0, 0.0, 0.0, + m_cameraTargetPosition[0]-m_cameraPosition[0],m_cameraTargetPosition[1]-m_cameraPosition[1], m_cameraTargetPosition[2]-m_cameraPosition[2], + m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); + glMatrixMode(GL_MODELVIEW); +} + +void DoublePrecisionDemo::keyboardCallback(unsigned char key, int x, int y) +{ + if (key == 'w') + { + if (m_debugMode & btIDebugDraw::DBG_DrawWireframe) + { + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawWireframe); + m_debugMode |= btIDebugDraw::DBG_DrawAabb; + } + else + { + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawAabb); + m_debugMode |= btIDebugDraw::DBG_DrawWireframe; + } + return; + } + + DemoApplication::keyboardCallback(key, x, y); +} + + diff --git a/Demos/ForkLiftDemo/ForkLiftDemo.cpp b/Demos/ForkLiftDemo/ForkLiftDemo.cpp index 48ee295b3..5c0a64b2b 100644 --- a/Demos/ForkLiftDemo/ForkLiftDemo.cpp +++ b/Demos/ForkLiftDemo/ForkLiftDemo.cpp @@ -433,7 +433,7 @@ void ForkLiftDemo::renderme() m_vehicle->updateWheelTransform(i,true); //draw wheels (cylinders) m_vehicle->getWheelInfo(i).m_worldTransform.getOpenGLMatrix(m); - m_shapeDrawer.drawOpenGL(m,&wheelShape,wheelColor,getDebugMode(),worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL(m,&wheelShape,wheelColor,getDebugMode(),worldBoundsMin,worldBoundsMax); } diff --git a/Demos/GimpactTestDemo/GimpactTestDemo.cpp b/Demos/GimpactTestDemo/GimpactTestDemo.cpp index 72cbac131..a78f8de43 100644 --- a/Demos/GimpactTestDemo/GimpactTestDemo.cpp +++ b/Demos/GimpactTestDemo/GimpactTestDemo.cpp @@ -157,7 +157,7 @@ void GimpactConcaveDemo::renderme() } } - m_shapeDrawer.drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),worldBoundsMin,worldBoundsMax); } diff --git a/Demos/GjkConvexCastDemo/LinearConvexCastDemo.cpp b/Demos/GjkConvexCastDemo/LinearConvexCastDemo.cpp index 00e4c965f..a1733d087 100644 --- a/Demos/GjkConvexCastDemo/LinearConvexCastDemo.cpp +++ b/Demos/GjkConvexCastDemo/LinearConvexCastDemo.cpp @@ -158,11 +158,11 @@ void LinearConvexCastDemo::displayCallback(void) btTransform tmp = tr[0]; tmp.setOrigin(result.m_hitPoint); tmp.getOpenGLMatrix(m3); - m_shapeDrawer.drawOpenGL( m3, &sphere, btVector3( 1, 0, 1 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL( m3, &sphere, btVector3( 1, 0, 1 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); - m_shapeDrawer.drawOpenGL( m1, shapePtr[ 0 ], btVector3( 1, 0, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); - m_shapeDrawer.drawOpenGL( m2, shapePtr[ 1 ], btVector3( 1, 0, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL( m1, shapePtr[ 0 ], btVector3( 1, 0, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL( m2, shapePtr[ 1 ], btVector3( 1, 0, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); btVector3 originA, originB; originA.setInterpolate3( tr[ 0 ].getOrigin(), toA.getOrigin(), result.m_fraction ); @@ -177,8 +177,8 @@ void LinearConvexCastDemo::displayCallback(void) A.getOpenGLMatrix( m1 ); B.getOpenGLMatrix( m2 ); - m_shapeDrawer.drawOpenGL( m1, shapePtr[ 0 ], btVector3( 1, 1, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); - m_shapeDrawer.drawOpenGL( m2, shapePtr[ 1 ], btVector3( 1, 1, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL( m1, shapePtr[ 0 ], btVector3( 1, 1, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL( m2, shapePtr[ 1 ], btVector3( 1, 1, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); glFlush(); glutSwapBuffers(); diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.cpp b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.cpp new file mode 100644 index 000000000..daebeab3b --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.cpp @@ -0,0 +1,1017 @@ +#include +#include "btHfFluid.h" +#include "btHfFluidCollisionShape.h" +#include "btHfFluidBuoyantConvexShape.h" +#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" +#include "BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h" +#include "BulletCollision/CollisionDispatch/btCollisionWorld.h" +#include "BulletCollision/CollisionDispatch/btManifoldResult.h" +#include "BulletCollision/CollisionShapes/btTriangleShape.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "Demos/OpenGL/GLDebugDrawer.h" + +btHfFluid::btHfFluid (btScalar gridCellWidth, int numNodesWidth, int numNodesLength) +{ + m_eta = NULL; + m_temp = NULL; + m_ground = NULL; + m_height[0] = NULL; + m_height[1] = NULL; + m_u[0] = NULL; + m_u[1] = NULL; + m_v[0] = NULL; + m_v[1] = NULL; + m_r[0] = NULL; + m_r[1] = NULL; + m_flags = NULL; + m_fillRatio = NULL; + m_internalType = CO_HF_FLUID; + m_heightIndex = 0; + m_velocityIndex = 0; + m_rIndex = 0; + setGridDimensions (gridCellWidth, numNodesWidth, numNodesLength); + + btScalar maxHeight = 20.0; + m_aabbMin = btVector3 (0.0, 0.0, 0.0); + m_aabbMax = btVector3 (m_gridWidth, maxHeight, m_gridLength); + + setCollisionShape (new btHfFluidCollisionShape (this)); + + m_globalVelocityU = btScalar(0.0f); + m_globalVelocityV = btScalar(0.0f); + m_gravity = btScalar(-10.0f); + + m_volumeDisplacementScale = btScalar(0.5f); + m_horizontalVelocityScale = btScalar(0.5f); + + m_epsEta = btScalar(0.01f); + m_epsHeight = btScalar(0.001f); +} + +btHfFluid::~btHfFluid () +{ + btCollisionShape* collisionShape = getCollisionShape (); + delete collisionShape; + btAlignedFree (m_temp); + btAlignedFree (m_height[0]); + btAlignedFree (m_height[1]); + btAlignedFree (m_ground); + btAlignedFree (m_eta); + btAlignedFree (m_u[0]); + btAlignedFree (m_u[1]); + btAlignedFree (m_v[0]); + btAlignedFree (m_v[1]); + btAlignedFree (m_flags); + btAlignedFree (m_fillRatio); +} + +void btHfFluid::predictMotion(btScalar dt) +{ + transferDisplaced (dt); + + advectEta (dt); + advectVelocityU (dt); + advectVelocityV (dt); + updateHeight (dt); + computeFlagsAndFillRatio (); + updateVelocity (dt); + setReflectBoundaryLeft (); + setReflectBoundaryRight (); + setReflectBoundaryTop (); + setReflectBoundaryBottom (); + debugTests(); + //m_heightIndex = (m_heightIndex + 1) % 2; + //m_velocityIndex = (m_velocityIndex + 1) % 2; +} + +void btHfFluid::prep () +{ + for (int i = 0; i < m_numNodesLength*m_numNodesWidth;i++) + { + m_height[0][i] = m_eta[i] + m_ground[i]; + m_height[1][i] = m_eta[i] + m_ground[i]; + } + computeFlagsAndFillRatio (); +} + +btScalar btHfFluid::widthPos (int i) const +{ + return m_gridCellWidth * i; +} + +btScalar btHfFluid::lengthPos (int j) const +{ +return m_gridCellWidth * j; +} + +int btHfFluid::arrayIndex (int i, int j) const +{ + btAssert (i >= 0); + btAssert (i < m_numNodesWidth); + btAssert (j >= 0); + btAssert (j < m_numNodesLength); + int index = i + (j * m_numNodesWidth); + return index; +} + +int btHfFluid::arrayIndex (btScalar i, btScalar j) const +{ + int ii = (int)i; // truncate / floor + int ij = (int)j; // truncate / floor + + return arrayIndex (ii, ij); +} + +const btScalar* btHfFluid::getHeightArray () const +{ + return m_height[m_heightIndex]; +} + +const btScalar* btHfFluid::getGroundArray () const +{ + return m_ground; +} +const btScalar* btHfFluid::getEtaArray () const +{ + return m_eta; +} +const btScalar* btHfFluid::getVelocityUArray () const +{ + return m_u[m_velocityIndex]; +} +const btScalar* btHfFluid::getVelocityVArray () const +{ + return m_v[m_velocityIndex]; +} + +const bool* btHfFluid::getFlagsArray () const +{ + return m_flags; +} + + btScalar* btHfFluid::getHeightArray () +{ + return m_height[m_heightIndex]; +} + btScalar* btHfFluid::getGroundArray () +{ + return m_ground; +} + btScalar* btHfFluid::getEtaArray () +{ + return m_eta; +} + btScalar* btHfFluid::getVelocityUArray () +{ + return m_u[m_velocityIndex]; +} + btScalar* btHfFluid::getVelocityVArray () +{ + return m_v[m_velocityIndex]; +} + +bool* btHfFluid::getFlagsArray () +{ + return m_flags; +} + +void btHfFluid::setFluidHeight (int x, int y, btScalar height) +{ + int index = arrayIndex (x,y); + setFluidHeight (index, height); +} + +void btHfFluid::setFluidHeight (int index, btScalar height) +{ + m_eta[index] = height; + m_height[m_heightIndex][index] = m_ground[index] + m_eta[index]; + m_flags[index] = true; +} + +void btHfFluid::addFluidHeight (int x, int y, btScalar height) +{ + int index = arrayIndex (x,y); + m_eta[index] += height; + m_height[m_heightIndex][index] = m_ground[index] + m_eta[index]; + m_flags[index] = true; +} + +void btHfFluid::getAabbForColumn (int i, int j, btVector3& aabbMin, btVector3& aabbMax) +{ + btVector3 com = getWorldTransform().getOrigin(); + int sw = arrayIndex (i, j); + int se = arrayIndex (i+1, j); + int nw = arrayIndex (i, j+1); + int ne = arrayIndex (i+1, j+1); + + btScalar h = m_height[m_heightIndex][sw]; + btScalar g = m_ground[sw]; + + aabbMin = btVector3(widthPos (i), g, lengthPos (j)); + aabbMax = btVector3(widthPos (i+1), h, lengthPos (j+1)); + aabbMin += com; + aabbMax += com; +} + +void btHfFluid::foreachGroundTriangle(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) +{ + btVector3 verts[3]; + + btScalar minX, minZ, maxX, maxZ; + int startNodeX, startNodeZ, endNodeX, endNodeZ; + + minX = aabbMin.getX(); + minZ = aabbMin.getZ(); + maxX = aabbMax.getX(); + maxZ = aabbMax.getZ(); + + startNodeX = (int)(minX * m_gridCellWidthInv); + startNodeZ = (int)(minZ * m_gridCellWidthInv); + + endNodeX = (int)(maxX * m_gridCellWidthInv); + endNodeZ = (int)(maxZ * m_gridCellWidthInv); + + endNodeX++; + endNodeZ++; + + startNodeX = btMax (1, startNodeX); + startNodeZ = btMax (1, startNodeZ); + endNodeX = btMin (m_numNodesWidth-1, endNodeX); + endNodeZ = btMin (m_numNodesLength-1, endNodeZ); + +#ifdef __BRUTE__ + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + // triangle 1 + verts[0] = btVector3(widthPos(i), m_ground[arrayIndex(i,j)], lengthPos(j)); + verts[1] = btVector3(widthPos(i), m_ground[arrayIndex(i,j+1)], lengthPos(j+1)); + verts[2] = btVector3(widthPos(i+1), m_ground[arrayIndex(i+1,j)], lengthPos(j)); + callback->processTriangle(verts,i,j); + // triangle 2 + verts[0] = btVector3(widthPos(i+1), m_ground[arrayIndex(i+1,j)], lengthPos(j)); + verts[1] = btVector3(widthPos(i), m_ground[arrayIndex(i,j+1)], lengthPos(j+1)); + verts[2] = btVector3(widthPos(i+1), m_ground[arrayIndex(i+1,j+1)], lengthPos(j+1)); + callback->processTriangle(verts,i,j); + } + } +#else + + for (int i = startNodeX; i < endNodeX; i++) + { + for (int j = startNodeZ; j < endNodeZ; j++) + { + // triangle 1 + verts[0] = btVector3(widthPos(i), m_ground[arrayIndex(i,j)], lengthPos(j)); + verts[1] = btVector3(widthPos(i), m_ground[arrayIndex(i,j+1)], lengthPos(j+1)); + verts[2] = btVector3(widthPos(i+1), m_ground[arrayIndex(i+1,j)], lengthPos(j)); + callback->processTriangle(verts,i,j); + // triangle 2 + verts[0] = btVector3(widthPos(i+1), m_ground[arrayIndex(i+1,j)], lengthPos(j)); + verts[1] = btVector3(widthPos(i), m_ground[arrayIndex(i,j+1)], lengthPos(j+1)); + verts[2] = btVector3(widthPos(i+1), m_ground[arrayIndex(i+1,j+1)], lengthPos(j+1)); + callback->processTriangle(verts,i,j); + } + } +#endif +} + +void btHfFluid::foreachFluidColumn (btHfFluidColumnCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) +{ + btScalar minX, minZ, maxX, maxZ; + int startNodeX, startNodeZ, endNodeX, endNodeZ; + + minX = aabbMin.getX(); + minZ = aabbMin.getZ(); + maxX = aabbMax.getX(); + maxZ = aabbMax.getZ(); + + startNodeX = (int)(minX * m_gridCellWidthInv); + startNodeZ = (int)(minZ * m_gridCellWidthInv); + + endNodeX = (int)(maxX * m_gridCellWidthInv); + endNodeZ = (int)(maxZ * m_gridCellWidthInv); + + endNodeX++; + endNodeZ++; + + startNodeX = btMax (1, startNodeX); + startNodeZ = btMax (1, startNodeZ); + endNodeX = btMin (m_numNodesWidth-2, endNodeX); + endNodeZ = btMin (m_numNodesLength-2, endNodeZ); + + bool r; + for (int i = startNodeX; i < endNodeX; i++) + { + for (int j = startNodeZ; j < endNodeZ; j++) + { + if (m_flags[arrayIndex (i, j)] == false) + continue; + + r = callback->processColumn (this, i, j); + if (!r) + return; + } + } +} + +void btHfFluid::foreachSurfaceTriangle (btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) +{ + btVector3 verts[3]; + + btScalar minX, minZ, maxX, maxZ; + int startNodeX, startNodeZ, endNodeX, endNodeZ; + + minX = aabbMin.getX(); + minZ = aabbMin.getZ(); + maxX = aabbMax.getX(); + maxZ = aabbMax.getZ(); + + startNodeX = (int)(minX * m_gridCellWidthInv); + startNodeZ = (int)(minZ * m_gridCellWidthInv); + + endNodeX = (int)(maxX * m_gridCellWidthInv); + endNodeZ = (int)(maxZ * m_gridCellWidthInv); + + endNodeX++; + endNodeZ++; + + startNodeX = btMax (1, startNodeX); + startNodeZ = btMax (1, startNodeZ); + endNodeX = m_numNodesWidth-1; + endNodeZ = m_numNodesLength-1; + + for (int i = startNodeX; i < endNodeX; i++) + { + for (int j = startNodeZ; j < endNodeZ; j++) + { + if (!m_flags[arrayIndex(i,j)]) + continue; + // triangle 1 + verts[0] = btVector3(widthPos(i), m_height[m_heightIndex][arrayIndex(i,j)], lengthPos(j)); + verts[1] = btVector3(widthPos(i), m_height[m_heightIndex][arrayIndex(i,j+1)], lengthPos(j+1)); + verts[2] = btVector3(widthPos(i+1), m_height[m_heightIndex][arrayIndex(i+1,j)], lengthPos(j)); + callback->processTriangle(verts,i,j); + // triangle 2 + verts[0] = btVector3(widthPos(i+1), m_height[m_heightIndex][arrayIndex(i+1,j)], lengthPos(j)); + verts[1] = btVector3(widthPos(i), m_height[m_heightIndex][arrayIndex(i,j+1)], lengthPos(j+1)); + verts[2] = btVector3(widthPos(i+1), m_height[m_heightIndex][arrayIndex(i+1,j+1)], lengthPos(j+1)); + callback->processTriangle(verts,i,j); + } + } +} + +void btHfFluid::setGridDimensions (btScalar gridCellWidth, + int numNodesWidth, int numNodesLength) +{ + m_gridWidth = gridCellWidth * numNodesWidth; + m_gridLength = gridCellWidth * numNodesLength; + m_gridCellWidth = gridCellWidth; + m_numNodesWidth = numNodesWidth; + m_numNodesLength = numNodesLength; + m_gridCellWidthInv = btScalar(1.0) / gridCellWidth; + + allocateArrays (); +} + +btScalar btHfFluid::bilinearInterpolate (const btScalar* array, btScalar iPos, btScalar jPos) +{ + int i = (int)iPos; + int j = (int)jPos; + + btScalar iParam1 = iPos - btScalar(i); + btScalar iParam0 = btScalar(1.0) - iParam1; + + btScalar jParam1 = jPos - btScalar(j); + btScalar jParam0 = btScalar(1.0) - jParam1; + + btScalar SW = array[arrayIndex(i, j)]; + btScalar SE = array[arrayIndex(i+1, j)]; + btScalar NW = array[arrayIndex(i, j+1)]; + btScalar NE = array[arrayIndex(i+1, j+1)]; + + btScalar a = jParam0 * SW + jParam1 * NW; + btScalar b = jParam0 * SE + jParam1 * NE; + return iParam0 * a + iParam1 * b; +} + +btScalar btHfFluid::advect (const btScalar* array, btScalar i, btScalar j, btScalar di, btScalar dj,btScalar dt) +{ + // trace particle backwards in time + btScalar srcI = i - di * dt * m_gridCellWidthInv; + btScalar srcJ = j - dj * dt * m_gridCellWidthInv; + + // srcI and srcJ are indices into the array, + // we need to clamp them to within the domain + srcI = btMax (srcI, btScalar(0.0)); + srcI = btMin (srcI, btScalar(m_numNodesWidth-1)); + srcJ = btMax (srcJ, btScalar(0.0)); + srcJ = btMin (srcJ, btScalar(m_numNodesLength-1)); + + return bilinearInterpolate (array, srcI, srcJ); +} + +void btHfFluid::advectEta (btScalar dt) +{ + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + int index = arrayIndex (i, j); + + if (!m_flags[index]) + continue; + + btScalar u = m_globalVelocityU; + btScalar v = m_globalVelocityV; + + u += (m_u[m_velocityIndex][index]+m_u[m_velocityIndex][index+1]) * btScalar(0.5); + v += (m_v[m_velocityIndex][index]+m_v[m_velocityIndex][index+m_numNodesWidth]) * btScalar(0.5); + + m_temp[index] = advect (m_eta, btScalar(i), btScalar(j), u, v, dt); + } + } + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + int index = arrayIndex (i, j); + m_eta[index] = m_temp[index]; + } + } +} + +void btHfFluid::updateHeight (btScalar dt) +{ + for (int j = 1; j < m_numNodesLength-1; j++) + { + for (int i = 1; i < m_numNodesWidth-1; i++) + { + int index = arrayIndex (i, j); + if (!m_flags[index]) + { + m_height[m_heightIndex][index] = m_ground[index] + m_eta[index]; + continue; + } + btScalar deta = -btScalar(0.5f) * m_eta[index] * dt * m_gridCellWidthInv * ( (m_u[m_velocityIndex][index+1] - m_u[m_velocityIndex][index]) + (m_v[m_velocityIndex][index+m_numNodesWidth] - m_v[m_velocityIndex][index])); + m_eta[index] += deta; + m_height[m_heightIndex][index] = m_ground[index] + btMax(m_eta[index],btScalar(0.0f)); + } + } +} + +void btHfFluid::advectVelocityU (btScalar dt) +{ + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + int index = arrayIndex (i, j); + if (!m_flags[index]) + { + continue; + } + btScalar u = m_globalVelocityU; + btScalar v = m_globalVelocityV; + + u += m_u[m_velocityIndex][index]; + v += (m_v[m_velocityIndex][index]+m_v[m_velocityIndex][index+1]+m_v[m_velocityIndex][index+m_numNodesWidth]+m_v[m_velocityIndex][index+m_numNodesWidth+1]) * btScalar(0.25); + + m_temp[index] = advect (m_u[m_velocityIndex], btScalar(i), btScalar(j), u, v, dt); + } + } + + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + int index = arrayIndex (i, j); + m_u[m_velocityIndex][index] = m_temp[index]; + } + } +} + +void btHfFluid::advectVelocityV (btScalar dt) +{ + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + int index = arrayIndex (i, j); + if (!m_flags[index]) + { + continue; + } + btScalar u = m_globalVelocityU; + btScalar v = m_globalVelocityV; + + u += (m_u[m_velocityIndex][index]+m_u[m_velocityIndex][index+1]+m_u[m_velocityIndex][index+m_numNodesWidth]+m_u[m_velocityIndex][index+m_numNodesWidth+1]) * btScalar(0.25); + v += m_v[m_velocityIndex][index]; + + + m_temp[index] = advect (m_v[m_velocityIndex], btScalar(i), btScalar(j), u, v, dt); + } + } + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + int index = arrayIndex (i, j); + m_v[m_velocityIndex][index] = m_temp[index]; + } + } +} + +void btHfFluid::addDisplaced (int i, int j, btScalar r) +{ + m_r[m_rIndex][arrayIndex(i,j)] += r; +} + +void btHfFluid::transferDisplaced (btScalar dt) +{ + for (int i = 2; i < m_numNodesWidth - 2; i++) + { + for (int j = 2; j < m_numNodesLength - 2; j++) + { + btScalar deltaR = m_r[m_rIndex][arrayIndex(i,j)] - m_r[(m_rIndex+1)%2][arrayIndex(i,j)]; + // deltaR is in volume, but we want to change the height.. + deltaR = deltaR / (m_gridCellWidth * m_gridCellWidth); + deltaR *= m_volumeDisplacementScale; + btScalar qdeltaR = deltaR / btScalar(4.0f); + m_eta[arrayIndex(i-1,j-1)] += qdeltaR; + m_eta[arrayIndex(i-1,j+1)] += qdeltaR; + m_eta[arrayIndex(i+1,j-1)] += qdeltaR; + m_eta[arrayIndex(i+1,j+1)] += qdeltaR; + m_eta[arrayIndex(i,j)] -= deltaR; + // OPTIMIZATION: zero out next frames r value + m_r[(m_rIndex+1)%2][arrayIndex(i,j)] = btScalar(0.0); + } + } + m_rIndex = (m_rIndex + 1) % 2; // flip frame +} + +void btHfFluid::updateVelocity (btScalar dt) +{ + for (int j = 1; j < m_numNodesLength-1; j++) + { + for (int i = 2; i < m_numNodesWidth-1; i++) + { + int index = arrayIndex (i, j); + if (!m_flags[index]) + { + continue; + } + m_u[m_velocityIndex][index] += m_gravity * dt * m_gridCellWidthInv * (m_height[m_heightIndex][index]-m_height[m_heightIndex][index-1]); + } + } + + for (int j = 2; j < m_numNodesLength-1; j++) + { + for (int i = 1; i < m_numNodesWidth-1; i++) + { + int index = arrayIndex (i, j); + if (!m_flags[index]) + { + continue; + } + m_v[m_velocityIndex][index] += m_gravity * dt * m_gridCellWidthInv * (m_height[m_heightIndex][index]-m_height[m_heightIndex][index-m_numNodesWidth]); + } + } +} + +void btHfFluid::setReflectBoundaryLeft () +{ + for (int j = 0; j < m_numNodesLength; j++) + { + int indexL = arrayIndex (0, j); + + m_height[m_heightIndex][indexL] = m_height[m_heightIndex][indexL+1]; + m_u[m_velocityIndex][indexL+1] = btScalar(0.0); + m_v[m_velocityIndex][indexL] = btScalar(0.0); + } +} + +void btHfFluid::setReflectBoundaryRight () +{ + for (int j = 0; j < m_numNodesLength; j++) + { + int indexR = arrayIndex (m_numNodesWidth-1, j); + + m_height[m_heightIndex][indexR] = m_height[m_heightIndex][indexR-1]; + m_u[m_velocityIndex][indexR-1] = btScalar(0.0); + m_v[m_velocityIndex][indexR] = btScalar(0.0); + } +} + +void btHfFluid::setReflectBoundaryBottom () +{ + for (int i = 0; i < m_numNodesWidth; i++) + { + int indexT = arrayIndex (i, 0); + + m_height[m_heightIndex][indexT] = m_height[m_heightIndex][indexT+m_numNodesWidth]; + m_v[m_velocityIndex][indexT+m_numNodesWidth] = btScalar(0.0); + m_u[m_velocityIndex][indexT] = btScalar(0.0); + } +} + +void btHfFluid::setReflectBoundaryTop () +{ + for (int i = 0; i < m_numNodesWidth; i++) + { + int indexB = arrayIndex (i, m_numNodesLength-1); + + m_height[m_heightIndex][indexB] = m_height[m_heightIndex][indexB-m_numNodesWidth]; + m_v[m_velocityIndex][indexB-m_numNodesWidth] = btScalar(0.0); + m_u[m_velocityIndex][indexB] = btScalar(0.0); + } +} + +void btHfFluid::setAbsorbBoundaryLeft (btScalar dt) +{ + for (int j = 0; j < m_numNodesLength; j++) + { + int indexL = arrayIndex (0, j); + + btScalar c = btSqrt(m_eta[indexL+1]*m_gravity); + m_height[m_heightIndex][indexL] = ((m_gridCellWidthInv * m_height[(m_heightIndex+1)%2][indexL+1])+(dt*c*m_height[m_heightIndex][indexL+1]))/(m_gridCellWidthInv + dt * c); + m_u[m_velocityIndex][indexL+1] = btScalar(0.0f); + m_v[m_velocityIndex][indexL+1] = btScalar(0.0); + } +} + +void btHfFluid::setAbsorbBoundaryRight (btScalar dt) +{ +} + +void btHfFluid::setAbsorbBoundaryTop (btScalar dt) +{ +} + +void btHfFluid::setAbsorbBoundaryBottom (btScalar dt) +{ +} + +void btHfFluid::computeFlagsAndFillRatio () +{ + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + btScalar h = m_height[m_heightIndex][arrayIndex(i,j)]; + btScalar hMin = computeHmin(i,j); + btScalar hMax = computeHmax(i,j); + btScalar etaMax = computeEtaMax(i,j); + if (h <= hMin && etaMax < m_epsEta) + { + m_flags[arrayIndex(i,j)] = false; + m_fillRatio[arrayIndex(i,j)] = btScalar(0.0f); + } else if (h > hMax) { + m_flags[arrayIndex(i,j)] = true; + m_fillRatio[arrayIndex(i,j)] = btScalar(1.0f); + } else { + m_flags[arrayIndex(i,j)] = true; + m_fillRatio[arrayIndex(i,j)] = (h - hMin)/(hMax - hMin); + } + + } + } +} + +btScalar btHfFluid::computeHmin (int i, int j) +{ + btAssert (i > 0); + btAssert (i < m_numNodesWidth-1); + btAssert (j > 0); + btAssert (j < m_numNodesLength-1); + + btScalar h1 = m_height[m_heightIndex][arrayIndex(i-1,j-1)]; + btScalar h2 = m_height[m_heightIndex][arrayIndex(i-1,j+1)]; + btScalar h3 = m_height[m_heightIndex][arrayIndex(i+1,j-1)]; + btScalar h4 = m_height[m_heightIndex][arrayIndex(i+1,j+1)]; + btScalar h = m_height[m_heightIndex][arrayIndex(i,j)]; + btScalar minh = btMin(h1, btMin(h2, btMin(h3,h4))); + + return (minh + h) * btScalar(0.5f); +} + +btScalar btHfFluid::computeHmax (int i, int j) +{ + btAssert (i > 0); + btAssert (i < m_numNodesWidth-1); + btAssert (j > 0); + btAssert (j < m_numNodesLength-1); + + btScalar h1 = m_height[m_heightIndex][arrayIndex(i-1,j-1)]; + btScalar h2 = m_height[m_heightIndex][arrayIndex(i-1,j+1)]; + btScalar h3 = m_height[m_heightIndex][arrayIndex(i+1,j-1)]; + btScalar h4 = m_height[m_heightIndex][arrayIndex(i+1,j+1)]; + btScalar h = m_height[m_heightIndex][arrayIndex(i,j)]; + btScalar maxh = btMax(h1, btMax(h2, btMax(h3,h4))); + + return (maxh + h) * btScalar(0.5f) + m_epsHeight; +} + +btScalar btHfFluid::computeEtaMax (int i, int j) +{ + btAssert (i > 0); + btAssert (i < m_numNodesWidth-1); + btAssert (j > 0); + btAssert (j < m_numNodesLength-1); + + btScalar eta1 = m_eta[arrayIndex(i-1,j-1)]; + btScalar eta2 = m_eta[arrayIndex(i-1,j+1)]; + btScalar eta3 = m_eta[arrayIndex(i+1,j-1)]; + btScalar eta4 = m_eta[arrayIndex(i+1,j+1)]; + btScalar eta = m_eta[arrayIndex(i,j)]; + btScalar maxeta = btMax(eta1, btMax(eta2, btMax(eta3,eta4))); + + return (maxeta + eta) * btScalar(0.5f); +} + +void btHfFluid::allocateArrays () +{ + if (m_temp) + btAlignedFree (m_temp); + if (m_height[0]) + { + btAlignedFree (m_height[0]); + btAlignedFree (m_height[1]); + } + if (m_ground) + btAlignedFree (m_ground); + if (m_eta) + btAlignedFree (m_eta); + if (m_u[0]) + { + btAlignedFree (m_u[0]); + btAlignedFree (m_u[1]); + } + if (m_v) + { + btAlignedFree (m_v[0]); + btAlignedFree (m_v[1]); + } + if (m_r) + { + btAlignedFree (m_r[0]); + btAlignedFree (m_r[1]); + } + if (m_flags) + btAlignedFree (m_flags); + if (m_fillRatio) + btAlignedFree (m_fillRatio); + + m_heightIndex = 0; + m_velocityIndex = 0; + m_temp = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_height[0] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_height[1] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_ground = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_eta = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_u[0] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_u[1] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_v[0] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_v[1] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_r[0] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_r[1] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_fillRatio = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_flags = (bool*)btAlignedAlloc (sizeof(bool) * m_numNodesWidth * m_numNodesLength, 16); + + { + int bufferSize = sizeof(btScalar) * m_numNodesWidth * m_numNodesLength; + printf("[HfFluid] Fluid buffer size %d bytes\n", bufferSize); + printf("[HfFluid] Temp %d buffers\n", 1); + printf("[HfFluid] Height %d buffers\n", 2); + printf("[HfFluid] Velocity %d buffers\n", 4); + printf("[HfFluid] Eta %d buffers\n", 1); + printf("[HfFluid] Fill Ratio %d buffers\n", 1); + printf("[HfFluid] ===============================\n"); + printf("[HfFluid] Total %d buffers\n", 9); + printf("[HfFluid] Total %d KB\n", (9 * bufferSize)/1024); + } + for (int i = 0; i < m_numNodesWidth*m_numNodesLength; i++) + { + m_eta[i] = btScalar(0.0); + m_u[0][i] = btScalar(0.0); + m_u[1][i] = btScalar(0.0); + m_v[0][i] = btScalar(0.0); + m_v[1][i] = btScalar(0.0); + m_r[0][i] = btScalar(0.0); + m_r[1][i] = btScalar(0.0); + m_height[0][i] = btScalar(0.0); + m_height[1][i] = btScalar(0.0); + m_ground[i] = btScalar(0.0); + m_flags[i] = false; + m_fillRatio[i] = btScalar(0.0); + m_temp[i] = btScalar(0.0); + } +} + + +void btHfFluid::debugTests () +{ + static btScalar total_volume = btScalar(0.0f); + btScalar new_total_volume = btScalar(0.0f); + for (int i = 0; i < m_numNodesWidth*m_numNodesLength; i++) + { + new_total_volume += m_eta[i] * m_gridCellWidth * m_gridCellWidth; + } + printf("volume = %f volume delta = %f\n", new_total_volume, new_total_volume - total_volume); + total_volume = new_total_volume; +} + +// You can enforce a global velocity at the surface of the fluid +// default: 0.0 and 0.0 +void btHfFluid::setGlobaVelocity (btScalar globalVelocityU, btScalar globalVelocityV) +{ + m_globalVelocityU = globalVelocityU; + m_globalVelocityV = globalVelocityV; +} + +void btHfFluid::getGlobalVelocity (btScalar& globalVelocityU, btScalar& globalVelocityV) const +{ + globalVelocityU = m_globalVelocityU; + globalVelocityV = m_globalVelocityV; +} + +// Control force of gravity, should match physics world +// default: -10.0 +void btHfFluid::setGravity (btScalar gravity) +{ + m_gravity = gravity; +} +btScalar btHfFluid::getGravity () const +{ + return m_gravity; +} + +// When a body is submerged into the fluid, the displaced fluid +// is spread to adjacent cells. You can control the percentage of this +// by setting this value between 0.0 and 1.0 +// default: 0.5 +void btHfFluid::setVolumeDisplacementScale (btScalar volumeDisplacementScale) +{ + m_volumeDisplacementScale = volumeDisplacementScale; +} + +btScalar btHfFluid::getVolumeDisplacementScale () const +{ + return m_volumeDisplacementScale; +} + +// The horizontal velocity of the fluid can influence bodies submerged +// in the fluid. You can control how much influence by setting this +// between 0.0 and 1.0 +// default: 0.5 +void btHfFluid::setHorizontalVelocityScale (btScalar horizontalVelocityScale) +{ + m_horizontalVelocityScale = horizontalVelocityScale; +} + +btScalar btHfFluid::getHorizontalVelocityScale () const +{ + return m_horizontalVelocityScale; +} + +static btScalar rangeOverlap (btScalar lo1, btScalar hi1, btScalar lo2, btScalar hi2, btScalar& loOut, btScalar& hiOut) +{ + if (!(lo1 <= hi2 && lo2 <= hi1)) + return btScalar(0.0f); + + if (lo1 >= lo2 && lo1 <= hi2 && + hi1 >= lo2 && hi1 <= hi2) + { + hiOut = hi1; + loOut = lo1; + return hi1 - lo1; + } else if (lo2 >= lo1 && lo2 <= hi1 && + hi2 >= lo1 && hi2 <= hi1) + { + hiOut = hi2; + loOut = lo2; + return hi2 - lo2; + } else if (hi1 >= lo2 && lo1 <= lo2) { + hiOut = hi1; + loOut = lo2; + return hi1 - lo2; + } else { + hiOut = hi2; + loOut = lo1; + return hi2 - lo1; + } +} + +btHfFluidColumnRigidBodyCallback::btHfFluidColumnRigidBodyCallback (btRigidBody* rigidBody, btIDebugDraw* debugDraw, btScalar density, btScalar floatyness) +{ + m_rigidBody = rigidBody; + m_buoyantShape = (btHfFluidBuoyantConvexShape*)rigidBody->getCollisionShape(); + m_debugDraw = debugDraw; + m_rigidBody->getAabb (m_aabbMin, m_aabbMax); + m_volume = btScalar(0.0f); + m_density = density; + m_floatyness = floatyness; + m_numVoxels = m_buoyantShape->getNumVoxels (); + for (int i = 0; i < m_numVoxels; i++) + { + btVector3 p = m_buoyantShape->getVoxelPositionsArray()[i]; + p = m_rigidBody->getWorldTransform().getBasis() * p; + p += m_rigidBody->getWorldTransform().getOrigin(); + m_voxelPositionsXformed[i] = p; + m_voxelSubmerged[i] = false; + } +} + +static bool sphereVsAABB (const btVector3& aabbMin, const btVector3& aabbMax, const btVector3& sphereCenter, const btScalar sphereRadius) +{ + btScalar totalDistance = 0; + + // Accumulate the distance of the sphere's center on each axis + for(int i = 0; i < 3; ++i) { + + // If the sphere's center is outside the aabb, we've got distance on this axis + if(sphereCenter[i] < aabbMin[i]) { + btScalar borderDistance = aabbMin[i] - sphereCenter[i]; + totalDistance += borderDistance * borderDistance; + + } else if(sphereCenter[i] > aabbMax[i]) { + btScalar borderDistance = sphereCenter[i] - aabbMax[i]; + totalDistance += borderDistance * borderDistance; + + } + // Otherwise the sphere's center is within the box on this axis, so the + // distance will be 0 and we do not need to accumulate anything at all + + } + + // If the distance to the box is lower than the sphere's radius, both are overlapping + return (totalDistance <= (sphereRadius * sphereRadius)); +} + +bool btHfFluidColumnRigidBodyCallback::processColumn (btHfFluid* fluid, int w, int l) +{ + btVector3 columnAabbMin,columnAabbMax; + + fluid->getAabbForColumn (w, l, columnAabbMin, columnAabbMax); + + bool applyBuoyancyImpulse = true; + bool applyFluidVelocityImpulse = true; + bool applyFluidDisplace = true; + + btScalar dt = btScalar(1.0f/60.0f); + + btScalar columnVolume = btScalar(0.0f); + + for (int i = 0; i < m_buoyantShape->getNumVoxels(); i++) + { + if (m_voxelSubmerged[i]) + continue; + + if (sphereVsAABB(columnAabbMin, columnAabbMax, m_voxelPositionsXformed[i], m_buoyantShape->getVoxelRadius())) + { + m_voxelSubmerged[i] = true; + btScalar voxelVolume = m_buoyantShape->getVolumePerVoxel(); + columnVolume += voxelVolume; + + btVector3 application_point = m_voxelPositionsXformed[i]; + btVector3 relative_position = application_point - m_rigidBody->getCenterOfMassPosition(); + + if (applyBuoyancyImpulse) + { + btScalar massDisplacedWater = voxelVolume * m_density * m_floatyness; + btScalar force = massDisplacedWater * -fluid->getGravity(); + btScalar impulseMag = force * dt; + btVector3 impulseVec = btVector3(btScalar(0.0f), btScalar(1.0f), btScalar(0.0f)) * impulseMag; +//#define CENTER_IMPULSE_ONLY 1 +#ifdef CENTER_IMPULSE_ONLY + m_rigidBody->applyCentralImpulse (impulseVec); +#else + m_rigidBody->applyImpulse (impulseVec, relative_position); +#endif + } + } + } + + if (columnVolume > btScalar(0.0)) + { + m_volume += columnVolume; + + if (applyFluidDisplace) + { + fluid->addDisplaced (w, l, columnVolume); + } + + if (applyFluidVelocityImpulse) + { + int index = fluid->arrayIndex (w,l); + btScalar u = fluid->getVelocityUArray()[index]; + btScalar v = fluid->getVelocityVArray()[index]; + btVector3 vd = btVector3(u, btScalar(0.0f), v); + btVector3 impulse = vd * dt * fluid->getHorizontalVelocityScale(); + m_rigidBody->applyCentralImpulse (impulse); + } + } + + return true; +} \ No newline at end of file diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.h b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.h new file mode 100644 index 000000000..d0d4572b3 --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.h @@ -0,0 +1,224 @@ +#ifndef __HFFLUID_H +#define __HFFLUID_H + +#include "BulletCollision/CollisionDispatch/btCollisionObject.h" +#include "BulletCollision/CollisionShapes/btTriangleCallback.h" + +class btPersistentManifold; +class btManifoldResult; + +// FIX AABB calculation for whole btHfFluid shape +// Fix flags and fill ratio +// -> Figure out the constants used in flags and fill ratio code +// Fix volume removal +// add buoyant convex vs. convex / concave +// add buoyant concave support (try bunny model) + +class btHfFluid : public btCollisionObject +{ +public: + btHfFluid (btScalar gridCellWidth, int numNodesWidth, int numNodesLength); + + ~btHfFluid (); + + void predictMotion(btScalar dt); + + /* Prep does some initial setup of the height field fluid. + * You should call this at initialization time. + */ + void prep (); + + static const btHfFluid* upcast(const btCollisionObject* colObj) + { + if (colObj->getInternalType()==CO_HF_FLUID) + return (const btHfFluid*)colObj; + return 0; + } + static btHfFluid* upcast(btCollisionObject* colObj) + { + if (colObj->getInternalType()==CO_HF_FLUID) + return (btHfFluid*)colObj; + return 0; + } + + // + // ::btCollisionObject + // + + virtual void getAabb(btVector3& aabbMin,btVector3& aabbMax) const + { + aabbMin = m_aabbMin; + aabbMax = m_aabbMax; + } + + int getNumNodesWidth () const { return m_numNodesWidth; } + int getNumNodesLength () const { return m_numNodesLength; } + + btScalar getGridCellWidth () const { return m_gridCellWidth; } + btScalar widthPos (int i) const; + btScalar lengthPos (int j) const; + + int arrayIndex (int i, int j) const; + int arrayIndex (btScalar i, btScalar j) const; + int arrayIndex (unsigned int i, unsigned int j) const; + const btScalar* getHeightArray () const; + const btScalar* getGroundArray () const; + const btScalar* getEtaArray () const; + const btScalar* getVelocityUArray () const; + const btScalar* getVelocityVArray () const; + const bool* getFlagsArray () const; + + void setFluidHeight (int x, int y, btScalar height); + void setFluidHeight (int index, btScalar height); + + void addFluidHeight (int x, int y, btScalar height); + void addDisplaced (int i, int j, btScalar r); + + void getAabbForColumn (int x, int y, btVector3& aabbMin, btVector3& aabbMax); + + btScalar* getHeightArray (); + btScalar* getGroundArray (); + btScalar* getEtaArray (); + btScalar* getVelocityUArray (); + btScalar* getVelocityVArray (); + bool* getFlagsArray (); + + void foreachGroundTriangle(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax); + class btHfFluidColumnCallback + { + public: + btHfFluidColumnCallback () {} + + virtual ~btHfFluidColumnCallback () {} + + virtual bool processColumn (btHfFluid* fluid, int w, int l) + { + return true; // keep going + } + }; + + void foreachFluidColumn (btHfFluidColumnCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax); + + void foreachSurfaceTriangle (btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax); +protected: + int m_numNodesWidth; + int m_numNodesLength; + + btScalar m_gridCellWidth; + btScalar m_gridWidth; + btScalar m_gridLength; + + btScalar m_gridCellWidthInv; + + btVector3 m_aabbMin; + btVector3 m_aabbMax; + + void setGridDimensions (btScalar gridCellWidth, + int numNodesWidth, int numNodesLength); + + btScalar bilinearInterpolate (const btScalar* array, btScalar i, btScalar j); + + btScalar advect (const btScalar* array, btScalar i, btScalar j, btScalar di, btScalar dj, btScalar dt); + + void advectEta (btScalar dt); + void updateHeight (btScalar dt); + + void advectVelocityU (btScalar dt); + void advectVelocityV (btScalar dt); + void updateVelocity (btScalar dt); + + void transferDisplaced (btScalar dt); + + void setReflectBoundaryLeft (); + void setReflectBoundaryRight (); + void setReflectBoundaryTop (); + void setReflectBoundaryBottom (); + + void setAbsorbBoundaryLeft (btScalar dt); + void setAbsorbBoundaryRight (btScalar dt); + void setAbsorbBoundaryTop (btScalar dt); + void setAbsorbBoundaryBottom (btScalar dt); + + void computeFlagsAndFillRatio (); + btScalar computeHmin (int i, int j); + btScalar computeHmax (int i, int j); + btScalar computeEtaMax (int i, int j); + + void allocateArrays (); + + void debugTests (); + + btScalar* m_temp; // temp + int m_heightIndex; + btScalar* m_height[2]; + btScalar* m_ground; + btScalar* m_eta; // height - ground + btScalar* m_u[2]; + btScalar* m_v[2]; + int m_rIndex; + btScalar* m_r[2]; + int m_velocityIndex; + bool* m_flags; + btScalar* m_fillRatio; + + // tweakables + btScalar m_globalVelocityU; + btScalar m_globalVelocityV; + btScalar m_gravity; + btScalar m_volumeDisplacementScale; + btScalar m_horizontalVelocityScale; + + btScalar m_epsHeight; + btScalar m_epsEta; +public: + // You can enforce a global velocity at the surface of the fluid + // default: 0.0 and 0.0 + void setGlobaVelocity (btScalar globalVelocityU, btScalar globalVelocityV); + void getGlobalVelocity (btScalar& globalVelocityU, btScalar& globalVelocityV) const; + + // Control force of gravity, should match physics world + // default: -10.0 + void setGravity (btScalar gravity); + btScalar getGravity () const; + + // When a body is submerged into the fluid, the displaced fluid + // is spread to adjacent cells. You can control the percentage of this + // by setting this value between 0.0 and 1.0 + // default: 0.5 + void setVolumeDisplacementScale (btScalar volumeDisplacementScale); + btScalar getVolumeDisplacementScale () const; + + // The horizontal velocity of the fluid can influence bodies submerged + // in the fluid. You can control how much influence by setting this + // between 0.0 and 1.0 + // default: 0.5 + void setHorizontalVelocityScale (btScalar horizontalVelocityScale); + btScalar getHorizontalVelocityScale () const; +}; + +class btRigidBody; +class btIDebugDraw; +class btHfFluidBuoyantConvexShape; + +class btHfFluidColumnRigidBodyCallback : public btHfFluid::btHfFluidColumnCallback +{ +protected: + btRigidBody* m_rigidBody; + btHfFluidBuoyantConvexShape* m_buoyantShape; + btIDebugDraw* m_debugDraw; + int m_numVoxels; + btVector3 m_voxelPositionsXformed[32*32*32]; + bool m_voxelSubmerged[32*32*32]; + btVector3 m_aabbMin; + btVector3 m_aabbMax; + btScalar m_volume; + btScalar m_density; + btScalar m_floatyness; +public: + btHfFluidColumnRigidBodyCallback (btRigidBody* rigidBody, btIDebugDraw* debugDraw, btScalar density, btScalar floatyness); + bool processColumn (btHfFluid* fluid, int w, int l); + btScalar getVolume () const { return m_volume; } +}; + +#endif + diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.cpp b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.cpp new file mode 100644 index 000000000..b148dc2bf --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.cpp @@ -0,0 +1,163 @@ +#include + +#include "LinearMath/btAabbUtil2.h" +#include "BulletCollision/CollisionShapes/btConvexShape.h" +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h" + +#include "BulletHfFluid/btHfFluidBuoyantConvexShape.h" + +btHfFluidBuoyantConvexShape::btHfFluidBuoyantConvexShape (btConvexShape* convexShape) +{ + m_convexShape = convexShape; + m_shapeType = HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE; + m_radius = btScalar(0.f); + m_totalVolume = btScalar(0.0f); + m_floatyness = btScalar(1.5f); +} + +void btHfFluidBuoyantConvexShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const +{ + return m_convexShape->getAabb (t, aabbMin, aabbMax); +} + +void btHfFluidBuoyantConvexShape::setMargin(btScalar margin) +{ + m_convexShape->setMargin (margin); +} + +void btHfFluidBuoyantConvexShape::setLocalScaling(const btVector3& scaling) +{ + m_convexShape->setLocalScaling (scaling); +} + +const char* btHfFluidBuoyantConvexShape::getName() const +{ + return "HF_FLUID_BUOYANT_CONVEX_SHAPE"; +} + +const btVector3& btHfFluidBuoyantConvexShape::getLocalScaling() const +{ + return m_convexShape->getLocalScaling(); +} + +void btHfFluidBuoyantConvexShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const +{ + m_convexShape->calculateLocalInertia (mass, inertia); +} + +btScalar btHfFluidBuoyantConvexShape::getMargin() const +{ + return m_convexShape->getMargin(); +} + +//must be above the machine epsilon +#define REL_ERROR2 btScalar(1.0e-6) +static bool intersect(btVoronoiSimplexSolver* simplexSolver, + const btTransform& transformA, + const btTransform& transformB, + btConvexShape* a, + btConvexShape* b) +{ + + btScalar squaredDistance = SIMD_INFINITY; + btTransform localTransA = transformA; + btTransform localTransB = transformB; + btVector3 positionOffset = (localTransA.getOrigin() + localTransB.getOrigin()) * btScalar(0.5); + localTransA.getOrigin() -= positionOffset; + localTransB.getOrigin() -= positionOffset; + btScalar delta = btScalar(0.); + btVector3 v = btVector3(1.0f, 0.0f, 0.0f); + simplexSolver->reset (); + do + { + btVector3 seperatingAxisInA = (-v)* transformA.getBasis(); + btVector3 seperatingAxisInB = v* transformB.getBasis(); + + btVector3 pInA = a->localGetSupportVertexNonVirtual(seperatingAxisInA); + btVector3 qInB = b->localGetSupportVertexNonVirtual(seperatingAxisInB); + + btVector3 pWorld = localTransA(pInA); + btVector3 qWorld = localTransB(qInB); + + btVector3 w = pWorld - qWorld; + delta = v.dot(w); + + // potential exit, they don't overlap + if ((delta > btScalar(0.0))) + { + return false; + } + + if (simplexSolver->inSimplex (w)) + { + return false; + } + + simplexSolver->addVertex (w, pWorld, qWorld); + + if (!simplexSolver->closest(v)) + { + return false; + } + + btScalar previousSquaredDistance = squaredDistance; + squaredDistance = v.length2(); + + if (previousSquaredDistance - squaredDistance <= SIMD_EPSILON * previousSquaredDistance) + { + return false; + } + } while (!simplexSolver->fullSimplex() && squaredDistance > REL_ERROR2 * simplexSolver->maxVertex()); + + return true; +} + +void btHfFluidBuoyantConvexShape::generateShape (btScalar radius, btScalar gap) +{ + btTransform T; + T.setIdentity (); + btVector3 aabbMin, aabbMax; + getAabb (T, aabbMin, aabbMax); + + m_radius = radius; + m_numVoxels = 0; + + btVoronoiSimplexSolver simplexSolver; + btSphereShape sphereShape(radius); + for (int i = 0; i < MAX_VOXEL_DIMENSION; i++) + { + for (int j = 0; j < MAX_VOXEL_DIMENSION; j++) + { + for (int k = 0; k < MAX_VOXEL_DIMENSION; k++) + { + btVector3 point; + btTransform sT; + sT.setIdentity (); + + point.setX(aabbMin.getX() + (i * btScalar(2.0f) * radius) + (i * gap)); + point.setY(aabbMin.getY() + (j * btScalar(2.0f) * radius) + (j * gap)); + point.setZ(aabbMin.getZ() + (k * btScalar(2.0f) * radius) + (k * gap)); + + if (TestPointAgainstAabb2(aabbMin, aabbMax, point)) + { + btTransform sT; + sT.setIdentity (); + sT.setOrigin (point); + + if (intersect (&simplexSolver, T, sT, m_convexShape, &sphereShape)) + { + m_voxelPositions[m_numVoxels] = point; + m_numVoxels++; + } + } + } + } + } + m_volumePerVoxel = btScalar(4.0f)/btScalar(3.0f)*SIMD_PI*radius*radius*radius; + m_totalVolume = m_numVoxels * m_volumePerVoxel; + m_radius = radius; +} \ No newline at end of file diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.h b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.h new file mode 100644 index 000000000..180183cfc --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.h @@ -0,0 +1,46 @@ +#ifndef __BT_HFFLUID_BUOYANT_CONVEX_SHAPE_H +#define __BT_HFFLUID_BUOYANT_CONVEX_SHAPE_H + +#include "LinearMath/btVector3.h" +#include "BulletCollision/CollisionShapes/btCollisionShape.h" + +#define MAX_VOXEL_DIMENSION 32 + +class btConvexShape; + +class btHfFluidBuoyantConvexShape : public btCollisionShape +{ +public: + btHfFluidBuoyantConvexShape (btConvexShape* convexShape); + + void generateShape (btScalar radius, btScalar gap); + + btConvexShape* getConvexShape () { return m_convexShape; } + + virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const; + virtual void setMargin(btScalar margin); + virtual btScalar getMargin() const; + virtual void setLocalScaling(const btVector3& scaling); + virtual const btVector3& getLocalScaling() const; + virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const; + virtual const char* getName()const; + + btScalar getVoxelRadius () const { return m_radius; } + btScalar getTotalVolume () const { return m_totalVolume; } + btScalar getVolumePerVoxel () const { return m_volumePerVoxel; } + btScalar getFloatyness () const { return m_floatyness; } + void setFloatyness (btScalar floatyness) { m_floatyness = floatyness; } + int getNumVoxels () const { return m_numVoxels; } + const btVector3* getVoxelPositionsArray() { return m_voxelPositions; } + +protected: + btScalar m_floatyness; + btScalar m_radius; + btScalar m_totalVolume; + btScalar m_volumePerVoxel; + int m_numVoxels; + btVector3 m_voxelPositions[MAX_VOXEL_DIMENSION*MAX_VOXEL_DIMENSION*MAX_VOXEL_DIMENSION]; + btConvexShape* m_convexShape; +}; + +#endif diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp new file mode 100644 index 000000000..bba6e286f --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp @@ -0,0 +1,58 @@ +#include + +#include "btHfFluidBuoyantShapeCollisionAlgorithm.h" +#include "btHfFluidBuoyantConvexShape.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" + +#include "BulletCollision/CollisionDispatch/btCollisionObject.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "btHfFluid.h" + +btHfFluidBuoyantShapeCollisionAlgorithm::btHfFluidBuoyantShapeCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver) +: btCollisionAlgorithm(ci), m_convexConvexAlgorithm(NULL, ci, col0, col1, simplexSolver, pdSolver) +{ + m_collisionObject0 = col0; + m_collisionObject1 = col1; +} + +btHfFluidBuoyantShapeCollisionAlgorithm::~btHfFluidBuoyantShapeCollisionAlgorithm() +{ +} + +void btHfFluidBuoyantShapeCollisionAlgorithm::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +{ + btHfFluidBuoyantConvexShape* tmpShape0 = (btHfFluidBuoyantConvexShape*)body0->getCollisionShape(); + btHfFluidBuoyantConvexShape* tmpShape1 = (btHfFluidBuoyantConvexShape*)body1->getCollisionShape(); + btConvexShape* convexShape0 = tmpShape0->getConvexShape(); + btConvexShape* convexShape1 = tmpShape1->getConvexShape(); + + body0->setCollisionShape (convexShape0); + body1->setCollisionShape (convexShape1); + + m_convexConvexAlgorithm.processCollision (body0, body1, dispatchInfo,resultOut); + + body0->setCollisionShape (tmpShape0); + body1->setCollisionShape (tmpShape1); +} + +btScalar btHfFluidBuoyantShapeCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +{ + btHfFluidBuoyantConvexShape* tmpShape0 = (btHfFluidBuoyantConvexShape*)body0->getCollisionShape(); + btHfFluidBuoyantConvexShape* tmpShape1 = (btHfFluidBuoyantConvexShape*)body1->getCollisionShape(); + btConvexShape* convexShape0 = tmpShape0->getConvexShape(); + btConvexShape* convexShape1 = tmpShape1->getConvexShape(); + + body0->setCollisionShape (convexShape0); + body1->setCollisionShape (convexShape1); + + btScalar toi = btScalar(0.0f); + + toi = m_convexConvexAlgorithm.calculateTimeOfImpact (body0, body1, dispatchInfo, resultOut); + + body0->setCollisionShape (tmpShape0); + body1->setCollisionShape (tmpShape1); + + return toi; +} diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.h b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.h new file mode 100644 index 000000000..580ced3b2 --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.h @@ -0,0 +1,83 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef HF_FLUID_BUOYANT_SHAPE_COLLISION_ALGORITHM_H +#define HF_FLUID_BUOYANT_SHAPE_COLLISION_ALGORITHM_H + +#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" +#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" +#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/CollisionShapes/btTriangleCallback.h" +#include "BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h" +#include "BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h" + +#include "LinearMath/btVector3.h" +class btHfFluid; + +class btConvexConvexAlgorithm; +class btConvexPenetrationDepthSolver; +class btSimplexSolverInterface; +/// btHfFluidBuoyantShapeCollisionAlgorithm provides collision detection between btHfFluidBuoyantConvexShape and btHfFluidBuoyantConvexShape +class btHfFluidBuoyantShapeCollisionAlgorithm : public btCollisionAlgorithm +{ + btCollisionObject* m_collisionObject0; + btCollisionObject* m_collisionObject1; + + btConvexConvexAlgorithm m_convexConvexAlgorithm; +public: + + btHfFluidBuoyantShapeCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver); + + virtual ~btHfFluidBuoyantShapeCollisionAlgorithm(); + + virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + + virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + m_convexConvexAlgorithm.getAllContactManifolds (manifoldArray); + } + + + struct CreateFunc :public btCollisionAlgorithmCreateFunc + { + btConvexPenetrationDepthSolver* m_pdSolver; + btSimplexSolverInterface* m_simplexSolver; + + CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver) + { + m_simplexSolver = simplexSolver; + m_pdSolver = pdSolver; + } + + virtual ~CreateFunc() {} + virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) + { + void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btHfFluidBuoyantShapeCollisionAlgorithm)); + if (!m_swapped) + { + return new(mem) btHfFluidBuoyantShapeCollisionAlgorithm(ci,body0,body1, m_simplexSolver, m_pdSolver); + } else + { + return new(mem) btHfFluidBuoyantShapeCollisionAlgorithm(ci,body0,body1, m_simplexSolver, m_pdSolver); + } + } + }; +}; + +#endif //HF_FLUID_BUOYANT_SHAPE_COLLISION_ALGORITHM_H diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.cpp b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.cpp new file mode 100644 index 000000000..0ac51da06 --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.cpp @@ -0,0 +1,2 @@ +#include "btHfFluidCollisionShape.h" + diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.h b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.h new file mode 100644 index 000000000..e067ad9c5 --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.h @@ -0,0 +1,78 @@ +#ifndef BT_HF_FLUID_COLLISION_SHAPE_H +#define BT_HF_FLUID_COLLISION_SHAPE_H + +#include "BulletHfFluid/btHfFluid.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/CollisionShapes/btConvexInternalShape.h" +#include "BulletCollision/CollisionShapes/btConcaveShape.h" + +class btHfFluidCollisionShape : public btConcaveShape +{ + public: + btHfFluid* m_fluid; + + btHfFluidCollisionShape(btHfFluid* backptr) : btConcaveShape () + { + m_shapeType = HFFLUID_SHAPE_PROXYTYPE; + m_fluid=backptr; + } + + virtual ~btHfFluidCollisionShape() + { + + } + + void processAllTriangles(btTriangleCallback* /*callback*/,const btVector3& /*aabbMin*/,const btVector3& /*aabbMax*/) const + { + //not yet + btAssert(0); + } + + ///getAabb returns the axis aligned bounding box in the coordinate frame of the given transform t. + virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const + { + /* t should be identity, but better be safe than...fast? */ + btVector3 mins; + btVector3 maxs; + + m_fluid->getAabb (mins, maxs); + + const btVector3 crns[]={t*btVector3(mins.x(),mins.y(),mins.z()), + t*btVector3(maxs.x(),mins.y(),mins.z()), + t*btVector3(maxs.x(),maxs.y(),mins.z()), + t*btVector3(mins.x(),maxs.y(),mins.z()), + t*btVector3(mins.x(),mins.y(),maxs.z()), + t*btVector3(maxs.x(),mins.y(),maxs.z()), + t*btVector3(maxs.x(),maxs.y(),maxs.z()), + t*btVector3(mins.x(),maxs.y(),maxs.z())}; + aabbMin=aabbMax=crns[0]; + for(int i=1;i<8;++i) + { + aabbMin.setMin(crns[i]); + aabbMax.setMax(crns[i]); + } + } + + virtual void setLocalScaling(const btVector3& /*scaling*/) + { + ///na + btAssert(0); + } + virtual const btVector3& getLocalScaling() const + { + static const btVector3 dummy(1,1,1); + return dummy; + } + virtual void calculateLocalInertia(btScalar /*mass*/,btVector3& /*inertia*/) const + { + ///not yet + btAssert(0); + } + virtual const char* getName()const + { + return "HfFluid"; + } +}; + +#endif diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.cpp b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.cpp new file mode 100644 index 000000000..e361589db --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.cpp @@ -0,0 +1,116 @@ +#include + +#include "btHfFluidRigidCollisionAlgorithm.h" +#include "btHfFluidBuoyantConvexShape.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/CollisionDispatch/btCollisionObject.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "btHfFluid.h" + +btHfFluidRigidCollisionAlgorithm::~btHfFluidRigidCollisionAlgorithm() +{ +} + +btHfFluidRigidCollisionAlgorithm::btHfFluidRigidCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1, bool isSwapped) +: btCollisionAlgorithm(ci), m_isSwapped(isSwapped), + m_convexTrianglecallback(ci.m_dispatcher1, col0, col1, !isSwapped) // we flip the isSwapped because we are hf fluid vs. convex and callback expects convex vs. concave +{ + m_manifoldPtr = m_convexTrianglecallback.m_manifoldPtr; + if (m_isSwapped) + { + m_hfFluid = static_cast(col1); + m_rigidCollisionObject = static_cast(col0); + m_manifoldPtr->setBodies(m_hfFluid,m_rigidCollisionObject); + } else { + m_hfFluid = static_cast(col0); + m_rigidCollisionObject = static_cast(col1); + m_manifoldPtr->setBodies(m_rigidCollisionObject,m_hfFluid); + } +} + +void btHfFluidRigidCollisionAlgorithm::processGround (const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +{ + btScalar triangleMargin = m_rigidCollisionObject->getCollisionShape()->getMargin(); + resultOut->setPersistentManifold(m_manifoldPtr); + // to perform the convex shape vs. ground terrain: + // we pull the convex shape out of the buoyant shape and replace it temporarily + btHfFluidBuoyantConvexShape* tmpShape = (btHfFluidBuoyantConvexShape*)m_rigidCollisionObject->getCollisionShape(); + btConvexShape* convexShape = ((btHfFluidBuoyantConvexShape*)tmpShape)->getConvexShape(); + m_rigidCollisionObject->setCollisionShape (convexShape); + m_convexTrianglecallback.setTimeStepAndCounters (triangleMargin, dispatchInfo, resultOut); + m_hfFluid->foreachGroundTriangle (&m_convexTrianglecallback, m_convexTrianglecallback.getAabbMin(),m_convexTrianglecallback.getAabbMax()); + resultOut->refreshContactPoints(); + // restore the buoyant shape + m_rigidCollisionObject->setCollisionShape (tmpShape); +} + +btScalar btHfFluidRigidCollisionAlgorithm::processFluid (const btDispatcherInfo& dispatchInfo, btScalar density, btScalar floatyness) +{ + btRigidBody* rb = btRigidBody::upcast(m_rigidCollisionObject); + btHfFluidColumnRigidBodyCallback columnCallback (rb, dispatchInfo.m_debugDraw, density, floatyness); + m_hfFluid->foreachFluidColumn (&columnCallback, m_convexTrianglecallback.getAabbMin(), m_convexTrianglecallback.getAabbMax()); + return columnCallback.getVolume (); +} + +void btHfFluidRigidCollisionAlgorithm::applyFluidFriction (btScalar mu, btScalar submerged_percentage) +{ + btRigidBody* rb = btRigidBody::upcast(m_rigidCollisionObject); + btScalar dt = btScalar(1.0f/60.0f); + +//#define OLD_WAY +#ifdef OLD_WAY + btScalar radius = btScalar(0.0f); + { + btVector3 aabbMin, aabbMax; + btTransform T; + T.setIdentity(); + rb->getCollisionShape()->getAabb (T, aabbMin, aabbMax); + radius = (aabbMax-aabbMin).length()*btScalar(0.5); + } + btScalar viscosity = btScalar(0.05); + btVector3 force = btScalar(6.0f) * SIMD_PI * viscosity * radius * -rb->getLinearVelocity(); + + btVector3 impulse = force * dt; + rb->applyCentralImpulse (impulse); + + if (true) + { + btVector3 av = rb->getAngularVelocity(); + av *= btScalar(0.99); + rb->setAngularVelocity (av); + } +#else + btScalar scaled_mu = mu * submerged_percentage * btScalar(0.4f); + rb->applyCentralImpulse (dt * scaled_mu * -rb->getLinearVelocity()); + rb->applyTorqueImpulse (dt * scaled_mu * -rb->getAngularVelocity()); +#endif +} + +void btHfFluidRigidCollisionAlgorithm::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +{ + processGround (dispatchInfo, resultOut); + btHfFluidBuoyantConvexShape* buoyantShape = (btHfFluidBuoyantConvexShape*)m_rigidCollisionObject->getCollisionShape(); + btRigidBody* rb = btRigidBody::upcast(m_rigidCollisionObject); + if (rb) + { + btScalar mass = btScalar(1.0f) / rb->getInvMass (); + btScalar volume = buoyantShape->getTotalVolume (); + btScalar density = mass / volume; + btScalar floatyness = buoyantShape->getFloatyness (); + btScalar submerged_volume = processFluid (dispatchInfo, density, floatyness); + if (submerged_volume > btScalar(0.0)) + { + btScalar submerged_percentage = submerged_volume/buoyantShape->getTotalVolume(); + //printf("%f\n", submerged_percentage); + btScalar mu = btScalar(6.0f); + applyFluidFriction (mu, submerged_percentage); + } + } +} + +btScalar btHfFluidRigidCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +{ + return btScalar(1.0); +} diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.h b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.h new file mode 100644 index 000000000..e7223ace8 --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.h @@ -0,0 +1,78 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef HF_FLUID_RIGID_COLLISION_ALGORITHM_H +#define HF_FLUID_RIGID_COLLISION_ALGORITHM_H + +#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" +#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" +#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/CollisionShapes/btTriangleCallback.h" +#include "BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h" + +#include "LinearMath/btVector3.h" +class btHfFluid; + +/// btHfFluidRigidCollisionAlgorithm provides collision detection between btHfFluid and btRigidBody +class btHfFluidRigidCollisionAlgorithm : public btCollisionAlgorithm +{ + btPersistentManifold* m_manifoldPtr; + + btHfFluid* m_hfFluid; + btCollisionObject* m_rigidCollisionObject; + + ///for rigid versus fluid (instead of fluid versus rigid), we use this swapped boolean + bool m_isSwapped; + + btConvexTriangleCallback m_convexTrianglecallback; + + void processGround (const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + void applyFluidFriction (btScalar mu, btScalar submerged_percentage); + btScalar processFluid (const btDispatcherInfo& dispatchInfo, btScalar density, btScalar floatyness); +public: + + btHfFluidRigidCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1, bool isSwapped); + + virtual ~btHfFluidRigidCollisionAlgorithm(); + + virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + + virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + manifoldArray.push_back (m_manifoldPtr); + } + + + struct CreateFunc :public btCollisionAlgorithmCreateFunc + { + virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) + { + void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btHfFluidRigidCollisionAlgorithm)); + if (!m_swapped) + { + return new(mem) btHfFluidRigidCollisionAlgorithm(ci,body0,body1,false); + } else + { + return new(mem) btHfFluidRigidCollisionAlgorithm(ci,body0,body1,true); + } + } + }; +}; + +#endif //HF_FLUID_RIGID_COLLISION_ALGORITHM_H diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.cpp b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.cpp new file mode 100644 index 000000000..bf253e811 --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.cpp @@ -0,0 +1,85 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btHfFluidRigidCollisionConfiguration.h" +#include "btHfFluidRigidCollisionAlgorithm.h" +#include "btHfFluidBuoyantShapeCollisionAlgorithm.h" +#include "LinearMath/btPoolAllocator.h" + +btHfFluidRigidCollisionConfiguration::btHfFluidRigidCollisionConfiguration(const btDefaultCollisionConstructionInfo& constructionInfo) +:btDefaultCollisionConfiguration(constructionInfo) +{ + void* mem; + + mem = btAlignedAlloc(sizeof(btHfFluidRigidCollisionAlgorithm::CreateFunc),16); + m_hfFluidRigidConvexCreateFunc = new(mem) btHfFluidRigidCollisionAlgorithm::CreateFunc; + + mem = btAlignedAlloc(sizeof(btHfFluidRigidCollisionAlgorithm::CreateFunc),16); + m_swappedHfFluidRigidConvexCreateFunc = new(mem) btHfFluidRigidCollisionAlgorithm::CreateFunc; + m_swappedHfFluidRigidConvexCreateFunc->m_swapped = true; + + mem = btAlignedAlloc(sizeof(btHfFluidBuoyantShapeCollisionAlgorithm::CreateFunc),16); + m_hfFluidBuoyantShapeCollisionCreateFunc = new(mem) btHfFluidBuoyantShapeCollisionAlgorithm::CreateFunc(m_simplexSolver, m_pdSolver); + + if (m_ownsCollisionAlgorithmPool && m_collisionAlgorithmPool) + { + int curElemSize = m_collisionAlgorithmPool->getElementSize(); + ///calculate maximum element size, big enough to fit any collision algorithm in the memory pool + + int maxSize0 = sizeof(btHfFluidRigidCollisionAlgorithm); + int maxSize1 = 0; + int maxSize2 = 0; + + int collisionAlgorithmMaxElementSize = btMax(maxSize0,maxSize1); + collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize,maxSize2); + + if (collisionAlgorithmMaxElementSize > curElemSize) + { + m_collisionAlgorithmPool->~btPoolAllocator(); + btAlignedFree(m_collisionAlgorithmPool); + void* mem = btAlignedAlloc(sizeof(btPoolAllocator),16); + m_collisionAlgorithmPool = new(mem) btPoolAllocator(collisionAlgorithmMaxElementSize,constructionInfo.m_defaultMaxCollisionAlgorithmPoolSize); + } + } +} + +btHfFluidRigidCollisionConfiguration::~btHfFluidRigidCollisionConfiguration() +{ + m_hfFluidRigidConvexCreateFunc->~btCollisionAlgorithmCreateFunc(); + m_swappedHfFluidRigidConvexCreateFunc->~btCollisionAlgorithmCreateFunc(); + btAlignedFree(m_hfFluidRigidConvexCreateFunc); + btAlignedFree(m_swappedHfFluidRigidConvexCreateFunc); +} + +btCollisionAlgorithmCreateFunc* btHfFluidRigidCollisionConfiguration::getCollisionAlgorithmCreateFunc(int proxyType0,int proxyType1) +{ + if ((proxyType0 == HFFLUID_SHAPE_PROXYTYPE) && (proxyType1 == HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE)) + { + return m_hfFluidRigidConvexCreateFunc; + } + + if ((proxyType0 == HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE) && (proxyType1 == HFFLUID_SHAPE_PROXYTYPE)) + { + return m_swappedHfFluidRigidConvexCreateFunc; + } + + if ((proxyType0 == HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE) && (proxyType1 == HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE)) + { + return m_hfFluidBuoyantShapeCollisionCreateFunc; + } + + ///fallback to the regular rigid collision shape + return btDefaultCollisionConfiguration::getCollisionAlgorithmCreateFunc(proxyType0,proxyType1); +} \ No newline at end of file diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.h b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.h new file mode 100644 index 000000000..78389cee7 --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.h @@ -0,0 +1,45 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef BT_HFFLUID_RIGID_COLLISION_CONFIGURATION +#define BT_HFFLUID_RIGID_COLLISION_CONFIGURATION + +#include "BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h" + +class btVoronoiSimplexSolver; +class btGjkEpaPenetrationDepthSolver; + + +///btSoftBodyRigidBodyCollisionConfiguration add softbody interaction on top of btDefaultCollisionConfiguration +class btHfFluidRigidCollisionConfiguration : public btDefaultCollisionConfiguration +{ + //default CreationFunctions, filling the m_doubleDispatch table + btCollisionAlgorithmCreateFunc* m_hfFluidRigidConvexCreateFunc; + btCollisionAlgorithmCreateFunc* m_swappedHfFluidRigidConvexCreateFunc; + btCollisionAlgorithmCreateFunc* m_hfFluidBuoyantShapeCollisionCreateFunc; + +public: + + btHfFluidRigidCollisionConfiguration(const btDefaultCollisionConstructionInfo& constructionInfo = btDefaultCollisionConstructionInfo()); + + virtual ~btHfFluidRigidCollisionConfiguration(); + + ///creation of soft-soft and soft-rigid, and otherwise fallback to base class implementation + virtual btCollisionAlgorithmCreateFunc* getCollisionAlgorithmCreateFunc(int proxyType0,int proxyType1); + +}; + +#endif //BT_HFFLUID_RIGID_COLLISION_CONFIGURATION + diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.cpp b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.cpp new file mode 100644 index 000000000..c8f25490d --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.cpp @@ -0,0 +1,271 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btIDebugDraw.h" +#include "BulletCollision/CollisionShapes/btCollisionShape.h" + +// height field fluid +#include "btHfFluid.h" +#include "btHfFluidBuoyantConvexShape.h" +#include "btHfFluidRigidDynamicsWorld.h" + + + + +btHfFluidRigidDynamicsWorld::btHfFluidRigidDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration) +:btDiscreteDynamicsWorld(dispatcher,pairCache,constraintSolver,collisionConfiguration) +{ + m_drawMode = DRAWMODE_NORMAL; + m_bodyDrawMode = BODY_DRAWMODE_NORMAL; +} + +btHfFluidRigidDynamicsWorld::~btHfFluidRigidDynamicsWorld() +{ + +} + +void btHfFluidRigidDynamicsWorld::predictUnconstraintMotion(btScalar timeStep) +{ + btDiscreteDynamicsWorld::predictUnconstraintMotion( timeStep); + + for ( int i=0;ipredictMotion(timeStep); + } +} + +void btHfFluidRigidDynamicsWorld::internalSingleStepSimulation( btScalar timeStep) +{ + btDiscreteDynamicsWorld::internalSingleStepSimulation( timeStep ); + + updateFluids (timeStep); + + solveFluidConstraints (timeStep); +} + +void btHfFluidRigidDynamicsWorld::updateFluids(btScalar timeStep) +{ + BT_PROFILE("updateFluids"); + + for ( int i=0;ipredictMotion (timeStep); + } +} + +void btHfFluidRigidDynamicsWorld::solveFluidConstraints(btScalar timeStep) +{ + BT_PROFILE("solve Fluid Contacts"); + +#if 0 + if(m_hfFluids.size()) + { + btHfFluid::solveClusters(m_hfFluids); + } + + for(int i=0;isolveConstraints(); + } +#endif +} + +void btHfFluidRigidDynamicsWorld::addHfFluid(btHfFluid* body) +{ + m_hfFluids.push_back(body); + + btCollisionWorld::addCollisionObject(body, + btBroadphaseProxy::DefaultFilter, + btBroadphaseProxy::AllFilter); + +} + +void btHfFluidRigidDynamicsWorld::removeHfFluid(btHfFluid* body) +{ + m_hfFluids.remove(body); + + btCollisionWorld::removeCollisionObject(body); +} + +void btHfFluidRigidDynamicsWorld::drawHfFluidGround (btIDebugDraw* debugDraw, btHfFluid* fluid) +{ + const btScalar* ground = fluid->getGroundArray (); + btVector3 com = fluid->getWorldTransform().getOrigin(); + btVector3 color = btVector3(btScalar(0.13f), btScalar(0.13f), btScalar(0.0)); + for (int i = 1; i < fluid->getNumNodesWidth()-1; i++) + { + for (int j = 1; j < fluid->getNumNodesLength()-1; j++) + { + int sw = fluid->arrayIndex (i, j); + int se = fluid->arrayIndex (i+1, j); + int nw = fluid->arrayIndex (i, j+1); + int ne = fluid->arrayIndex (i+1, j+1); + btVector3 swV = btVector3 (fluid->widthPos (i), ground[sw], fluid->lengthPos (j)); + btVector3 seV = btVector3 (fluid->widthPos (i+1), ground[se], fluid->lengthPos (j)); + btVector3 nwV = btVector3 (fluid->widthPos (i), ground[nw], fluid->lengthPos (j+1)); + btVector3 neV = btVector3 (fluid->widthPos (i+1), ground[ne], fluid->lengthPos (j+1)); + debugDraw->drawTriangle (swV+com, seV+com, nwV+com, color, btScalar(1.0f)); + debugDraw->drawTriangle (seV+com, neV+com, nwV+com, color, btScalar(1.0f)); + } + } +} + +void btHfFluidRigidDynamicsWorld::drawHfFluidVelocity (btIDebugDraw* debugDraw, btHfFluid* fluid) +{ + btScalar alpha(0.7f); + const btScalar* height = fluid->getHeightArray (); + btVector3 com = fluid->getWorldTransform().getOrigin(); + btVector3 red = btVector3(btScalar(1.0f), btScalar(0.0f), btScalar(0.0)); + btVector3 green = btVector3(btScalar(0.0f), btScalar(1.0f), btScalar(0.0)); + const bool* flags = fluid->getFlagsArray (); + for (int i = 1; i < fluid->getNumNodesWidth()-1; i++) + { + for (int j = 1; j < fluid->getNumNodesLength()-1; j++) + { + int index = fluid->arrayIndex (i, j); + if (!flags[index]) + continue; + btVector3 from = btVector3 (fluid->widthPos (i), height[index]+btScalar(0.1f), fluid->lengthPos (j)); + btVector3 velocity; + velocity.setX (fluid->getVelocityUArray()[index]); + velocity.setY (btScalar(0.0f)); + velocity.setZ (fluid->getVelocityVArray()[index]); + velocity.normalize(); + btVector3 to = from + velocity; + + debugDraw->drawLine (from+com, to+com, red, green); + } + } +} + +void btHfFluidRigidDynamicsWorld::drawHfFluidBuoyantConvexShape (btIDebugDraw* debugDrawer, btCollisionObject* object, btHfFluidBuoyantConvexShape* buoyantShape, int voxelDraw) +{ + if (voxelDraw) + { + btTransform xform = object->getWorldTransform(); + for (int i = 0; i < buoyantShape->getNumVoxels(); i++) + { + btVector3 p = buoyantShape->getVoxelPositionsArray()[i]; + p = xform.getBasis() * p; + p += xform.getOrigin(); + debugDrawer->drawSphere (p, buoyantShape->getVoxelRadius(), btVector3(1.0, 0.0, 0.0)); + } + } else { + btVector3 color(btScalar(255.),btScalar(255.),btScalar(255.)); + switch(object->getActivationState()) + { + case ACTIVE_TAG: + color = btVector3(btScalar(255.),btScalar(255.),btScalar(255.)); break; + case ISLAND_SLEEPING: + color = btVector3(btScalar(0.),btScalar(255.),btScalar(0.));break; + case WANTS_DEACTIVATION: + color = btVector3(btScalar(0.),btScalar(255.),btScalar(255.));break; + case DISABLE_DEACTIVATION: + color = btVector3(btScalar(255.),btScalar(0.),btScalar(0.));break; + case DISABLE_SIMULATION: + color = btVector3(btScalar(255.),btScalar(255.),btScalar(0.));break; + default: + { + color = btVector3(btScalar(255.),btScalar(0.),btScalar(0.)); + } + }; + + btConvexShape* convexShape = ((btHfFluidBuoyantConvexShape*)object->getCollisionShape())->getConvexShape(); + debugDrawObject(object->getWorldTransform(),(btCollisionShape*)convexShape,color); + } +} + +void btHfFluidRigidDynamicsWorld::drawHfFluidNormal (btIDebugDraw* debugDraw, btHfFluid* fluid) +{ + int colIndex = 0; + btVector3 col[2]; + col[0] = btVector3(btScalar(0.0f), btScalar(0.0f), btScalar(1.0)); + col[1] = btVector3(btScalar(0.0f), btScalar(0.5f), btScalar(0.5)); + btScalar alpha(0.7f); + const btScalar* height = fluid->getHeightArray (); + const btScalar* eta = fluid->getEtaArray (); + const btScalar* ground = fluid->getGroundArray (); + btVector3 com = fluid->getWorldTransform().getOrigin(); + const bool* flags = fluid->getFlagsArray (); + for (int i = 0; i < fluid->getNumNodesWidth()-1; i++) + { + for (int j = 0; j < fluid->getNumNodesLength()-1; j++) + { + int sw = fluid->arrayIndex (i, j); + int se = fluid->arrayIndex (i+1, j); + int nw = fluid->arrayIndex (i, j+1); + int ne = fluid->arrayIndex (i+1, j+1); + + btScalar h = eta[sw]; + btScalar g = ground[sw]; + + if (h < btScalar(0.05f)) + continue; + + if (h <= btScalar(0.01f)) + continue; + + btVector3 boxMin = btVector3(fluid->widthPos (i), g, fluid->lengthPos(j)); + btVector3 boxMax = btVector3(fluid->widthPos(i+1), g+h, fluid->lengthPos(j+1)); + boxMin += com; + boxMax += com; + + debugDraw->drawBox (boxMin, boxMax, btVector3(btScalar(0.0f), btScalar(0.0f), btScalar(1.0f)), btScalar(1.0f)); + } + } +} + +void btHfFluidRigidDynamicsWorld::debugDrawWorld() +{ + if (getDebugDrawer()) + { + int i; + for ( i=0;im_hfFluids.size();i++) + { + btHfFluid* phh=(btHfFluid*)this->m_hfFluids[i]; + switch (m_drawMode) + { + case DRAWMODE_NORMAL: + drawHfFluidGround (m_debugDrawer, phh); + //drawHfFluidNormal (m_debugDrawer, phh); + break; + case DRAWMODE_VELOCITY: + drawHfFluidGround (m_debugDrawer, phh); + //drawHfFluidNormal (m_debugDrawer, phh); + drawHfFluidVelocity (m_debugDrawer, phh); + break; + default: + btAssert (0); + break; + } + } + for (i = 0; i < this->m_collisionObjects.size(); i++) + { + btCollisionShape* shape = m_collisionObjects[i]->getCollisionShape(); + if (shape->getShapeType() == HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE) + { + btHfFluidBuoyantConvexShape* buoyantShape = (btHfFluidBuoyantConvexShape*)shape; + drawHfFluidBuoyantConvexShape (m_debugDrawer, m_collisionObjects[i], buoyantShape, m_bodyDrawMode); + } + } + } + btDiscreteDynamicsWorld::debugDrawWorld(); +} diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.h b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.h new file mode 100644 index 000000000..08ed8c90f --- /dev/null +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.h @@ -0,0 +1,89 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" + +#ifndef BT_HFFLUID_RIGID_DYNAMICS_WORLD_H +#define BT_HFFLUID_RIGID_DYNAMICS_WORLD_H + +class btHfFluid; +typedef btAlignedObjectArray btHfFluidArray; + +#define DRAWMODE_NORMAL 0 +#define DRAWMODE_VELOCITY 1 +#define DRAWMODE_MAX 2 + +#define BODY_DRAWMODE_NORMAL 0 +#define BODY_DRAWMODE_VOXEL 1 +#define BODY_DRAWMODE_MAX 2 + +class btHfFluidBuoyantConvexShape; + +class btHfFluidRigidDynamicsWorld : public btDiscreteDynamicsWorld +{ + + btHfFluidArray m_hfFluids; + int m_drawMode; + int m_bodyDrawMode; +protected: + + virtual void predictUnconstraintMotion(btScalar timeStep); + + virtual void internalSingleStepSimulation( btScalar timeStep); + + void updateFluids(btScalar timeStep); + + void solveFluidConstraints(btScalar timeStep); + + virtual void debugDrawWorld(); + + void drawHfFluidGround (btIDebugDraw* debugDraw, btHfFluid* fluid); + void drawHfFluidVelocity (btIDebugDraw* debugDraw, btHfFluid* fluid); + void drawHfFluidBuoyantConvexShape (btIDebugDraw* debugDrawer, btCollisionObject* object, btHfFluidBuoyantConvexShape* buoyantShape, int voxelDraw); + void drawHfFluidNormal (btIDebugDraw* debugDraw, btHfFluid* fluid); +public: + + btHfFluidRigidDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration); + + virtual ~btHfFluidRigidDynamicsWorld(); + + + void addHfFluid(btHfFluid* fluid); + + void removeHfFluid(btHfFluid* fluid); + + void setDrawMode (int drawMode) + { + m_drawMode = drawMode; + } + + void setBodyDrawMode (int bodyDrawMode) + { + m_bodyDrawMode = bodyDrawMode; + } + + btHfFluidArray& getHfFluidArray() + { + return m_hfFluids; + } + + const btHfFluidArray& getHfFluidArray() const + { + return m_hfFluids; + } + +}; + +#endif //BT_HFFLUID_RIGID_DYNAMICS_WORLD_H diff --git a/Demos/HeightFieldFluidDemo/CMakeLists.txt b/Demos/HeightFieldFluidDemo/CMakeLists.txt new file mode 100644 index 000000000..e07139c1d --- /dev/null +++ b/Demos/HeightFieldFluidDemo/CMakeLists.txt @@ -0,0 +1,35 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + + + +# You shouldn't have to modify anything below this line +######################################################## + + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +LibOpenGLSupport LibBulletDynamics LibBulletCollision LibLinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(HfFluidDemo + HfFluidDemo_GL_ShapeDrawer.cpp + BulletHfFluid/btHfFluid.cpp + BulletHfFluid/btHfFluidBuoyantConvexShape.cpp + BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp + BulletHfFluid/btHfFluidCollisionShape.cpp + BulletHfFluid/btHfFluidRigidCollisionAlgorithm.cpp + BulletHfFluid/btHfFluidRigidCollisionConfiguration.cpp + BulletHfFluid/btHfFluidRigidDynamicsWorld.cpp + main.cpp + HfFluidDemo.cpp +) + diff --git a/Demos/HeightFieldFluidDemo/HfFluidDemo.cpp b/Demos/HeightFieldFluidDemo/HfFluidDemo.cpp new file mode 100644 index 000000000..fca1077c3 --- /dev/null +++ b/Demos/HeightFieldFluidDemo/HfFluidDemo.cpp @@ -0,0 +1,1414 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btBulletDynamicsCommon.h" + +#include "BulletHfFluid/btHfFluidRigidDynamicsWorld.h" +#include "BulletHfFluid/btHfFluid.h" +#include "BulletHfFluid/btHfFluidRigidCollisionConfiguration.h" +#include "BulletHfFluid/btHfFluidBuoyantConvexShape.h" +#include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h" +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btIDebugDraw.h" +#include "LinearMath/btRandom.h" +#include "BMF_Api.h" +#include //printf debugging +#include "LinearMath/btConvexHull.h" + +#include "HfFluidDemo.h" +#include "GL_ShapeDrawer.h" +#include "HfFluidDemo_GL_ShapeDrawer.h" + +#include "GlutStuff.h" + +extern float eye[3]; +extern int glutScreenWidth; +extern int glutScreenHeight; + +const int maxProxies = 32766; +const int maxOverlap = 65535; + +static btVector3* gGroundVertices=0; +static int* gGroundIndices=0; +static btBvhTriangleMeshShape* trimeshShape =0; +static btRigidBody* staticBody = 0; +static float waveheight = 5.f; + +const float TRIANGLE_SIZE=8.f; + +#define ARRAY_SIZE_X 1 +#define ARRAY_SIZE_Y 1 +#define ARRAY_SIZE_Z 1 + +//maximum number of objects (and allow user to shoot additional boxes) +#define MAX_PROXIES (ARRAY_SIZE_X*ARRAY_SIZE_Y*ARRAY_SIZE_Z + 1024) + +#define START_POS_X 5 +#define START_POS_Y -5 +#define START_POS_Z 3 + +unsigned int current_draw_mode=DRAWMODE_NORMAL; +unsigned int current_body_draw_mode = 0; +unsigned current_demo=0; + +void Init_Floatyness (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(0.25), 100, 100); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-10.0), btScalar(-5.0), btScalar(-10.0)); + fluid->setWorldTransform (xform); + fluid->setHorizontalVelocityScale (btScalar(0.0f)); + fluid->setVolumeDisplacementScale (btScalar(0.0f)); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->setFluidHeight(i, btScalar(5.0f)); + } + + fluid->prep (); + + const int numObjects = 5; + btScalar floatyness = btScalar(1.0f); + btScalar dfloatyness = btScalar(0.25f); + btScalar start_x = btScalar(-5.0f); + btScalar step_x = btScalar(3.0f); + btScalar start_z = btScalar(-5.0f); + for (int i = 0; i < numObjects; i++) + { + //btConvexShape* colShape = new btBoxShape(btVector3(1.0, 1.0, 1.0)); + btConvexShape* colShape = new btSphereShape(btScalar(1.)); + btHfFluidBuoyantConvexShape* buoyantShape = new btHfFluidBuoyantConvexShape(colShape); + buoyantShape->generateShape (btScalar(0.25f), btScalar(0.05f)); + buoyantShape->setFloatyness (floatyness + dfloatyness * i); + fluidDemo->m_collisionShapes.push_back (buoyantShape); + + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + btVector3 localInertia(0,0,0); + colShape->calculateLocalInertia(mass,localInertia); + + btVector3 origin = btVector3(step_x * i + start_x, 7.5f, start_z); + startTransform.setOrigin(origin); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,buoyantShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + fluidDemo->getHfFluidDynamicsWorld()->addRigidBody(body); + } + floatyness = btScalar(2.0f); + start_z = btScalar(5.0f); + for (int i = 0; i < numObjects; i++) + { + //btConvexShape* colShape = new btBoxShape(btVector3(1.0, 1.0, 1.0)); + btConvexShape* colShape = new btSphereShape(btScalar(1.)); + btHfFluidBuoyantConvexShape* buoyantShape = new btHfFluidBuoyantConvexShape(colShape); + buoyantShape->generateShape (btScalar(0.25f), btScalar(0.05f)); + buoyantShape->setFloatyness (floatyness + dfloatyness * i); + fluidDemo->m_collisionShapes.push_back (buoyantShape); + + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + btVector3 localInertia(0,0,0); + colShape->calculateLocalInertia(mass,localInertia); + + btVector3 origin = btVector3(step_x * i + start_x, -4.0f, start_z); + startTransform.setOrigin(origin); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,buoyantShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + fluidDemo->getHfFluidDynamicsWorld()->addRigidBody(body); + } +} + +void Init_Bowl (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0), 50, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-10.0), btScalar(-5.0), btScalar(-10.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + btScalar* ground = fluid->getGroundArray(); + btScalar* eta = fluid->getEtaArray(); + btScalar amplitude = btScalar(200.0); + for (int i = 0; i < fluid->getNumNodesWidth(); i++) + { + btScalar x = btScalar(i - fluid->getNumNodesWidth()/2)/btScalar(fluid->getNumNodesWidth()*2); + btScalar xh = amplitude * (x * x) + btScalar(5.0); + for (int j = 0; j < fluid->getNumNodesLength(); j++) + { + btScalar y = btScalar(j - fluid->getNumNodesLength()/2)/btScalar(fluid->getNumNodesLength()*2); + btScalar yh = amplitude * (y * y) + btScalar(5.0); + btScalar gHeight = max(xh,yh); + int index = fluid->arrayIndex (i, j); + ground[index] = gHeight; + btScalar wHeight = btScalar(0.0f); + if (gHeight > 14.0) + { + wHeight = btScalar(0.0f); + } else { + wHeight = btScalar(14.0f) - gHeight; + } + eta[index] = wHeight; } + } + + fluid->prep (); + + { + //create a few dynamic rigidbodies + // Re-using the same collision is better for memory usage and performance + + btConvexShape* colShape = new btBoxShape(btVector3(1,1,1)); + btHfFluidBuoyantConvexShape* buoyantShape = new btHfFluidBuoyantConvexShape(colShape); + buoyantShape->generateShape (btScalar(0.25f), btScalar(0.05f)); + //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + fluidDemo->m_collisionShapes.push_back(colShape); + fluidDemo->m_collisionShapes.push_back (buoyantShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + colShape->calculateLocalInertia(mass,localInertia); + + float start_x = START_POS_X - ARRAY_SIZE_X/2; + float start_y = START_POS_Y; + float start_z = START_POS_Z - ARRAY_SIZE_Z/2; + + for (int k=0;kgetHfFluidDynamicsWorld()->addRigidBody(body); + } + } + } + } +} + +void Init_Drops (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(0.5), 50, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-10.0), btScalar(-5.0), btScalar(-10.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->setFluidHeight(i, btScalar(5.0f)); + } + + fluid->prep (); + { + //create a few dynamic rigidbodies + // Re-using the same collision is better for memory usage and performance + + btConvexShape* colShape = new btBoxShape(btVector3(5,0.5,5)); + btHfFluidBuoyantConvexShape* buoyantShape = new btHfFluidBuoyantConvexShape(colShape); + buoyantShape->generateShape (btScalar(0.25f), btScalar(0.05f)); + //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + fluidDemo->m_collisionShapes.push_back(colShape); + fluidDemo->m_collisionShapes.push_back (buoyantShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + colShape->calculateLocalInertia(mass,localInertia); + + float start_x = START_POS_X - ARRAY_SIZE_X/2; + float start_y = START_POS_Y; + float start_z = START_POS_Z - ARRAY_SIZE_Z/2; + + for (int k=0;kgetHfFluidDynamicsWorld()->addRigidBody(body); + } + } + } + } +} + +void Init_Wave (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0f), 75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(-5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->getEtaArray()[i] = btScalar(10.0f); + } + + for (int i = 1; i < fluid->getNumNodesWidth()-1; i++) + { + fluid->getEtaArray()[fluid->arrayIndex (i, fluid->getNumNodesLength()/2-1)] = btScalar (2.0); + fluid->getEtaArray()[fluid->arrayIndex (i, fluid->getNumNodesLength()/2)] = btScalar (2.0); + fluid->getEtaArray()[fluid->arrayIndex (i, fluid->getNumNodesLength()/2+1)] = btScalar (2.0); + } + + fluid->prep (); +} + +void Init_RandomDrops (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0),75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(-5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->getEtaArray()[i] = btScalar(0.0f); + } + fluid->prep (); +} + +void Init_FillPool (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + const int gridLength = 50; + const int gridWidth = 50; + fluid = new btHfFluid (btScalar(1.0), gridLength, gridWidth); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-20.0), btScalar(-5.0), btScalar(-20.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + btScalar* ground = fluid->getGroundArray(); + btScalar* eta = fluid->getEtaArray(); + + const btScalar poolEdgeHeight = btScalar(10.0f); + const btScalar poolBottomHeight = btScalar(1.0f); + const btScalar poolPourerHeight = btScalar(6.0f); + for (int j = 1; j < fluid->getNumNodesLength()-1; j++) + { + for (int i = 1; i < fluid->getNumNodesWidth()-1; i++) + { + int index = fluid->arrayIndex (i, j); + // pool edge + if (j == 1 || i == 1 || j == fluid->getNumNodesLength()-2 || i == fluid->getNumNodesWidth()-2) + { + ground[index] = poolEdgeHeight; + continue; + } + if (j > 35) + { + if (i <= 25 || i >= 30) + { + ground[index] = poolEdgeHeight; + } else { + ground[index] = poolPourerHeight; + } + continue; + } + ground[index] = poolBottomHeight; + //eta[index] = btScalar(3.0f); + } + } + fluid->prep (); + + { + btConvexShape* colShape = new btBoxShape(btVector3(btScalar(1.), btScalar(1.), btScalar(1.))); + btHfFluidBuoyantConvexShape* buoyantShape = new btHfFluidBuoyantConvexShape(colShape); + buoyantShape->generateShape (btScalar(0.25f), btScalar(0.05f)); + fluidDemo->m_collisionShapes.push_back(colShape); + fluidDemo->m_collisionShapes.push_back(buoyantShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + colShape->calculateLocalInertia(mass,localInertia); + + int gridSize = 2; + btScalar startPosX = btScalar(-10.0f); + btScalar startPosY = btScalar(2.0f); + btScalar startPosZ = btScalar(-10.f); + float start_x = startPosX - gridSize/2; + float start_y = startPosY; + float start_z = startPosZ - gridSize/2; + + for (int k=0;kgetHfFluidDynamicsWorld()->addRigidBody(body); + } + } + } + } +} + +void Run_FillPool (HfFluidDemo* fluidDemo) +{ + static btScalar dtSinceLastDrop = btScalar(0.0f); + btScalar dt = btScalar(1.0/60.); + btHfFluidArray& fluids = fluidDemo->getHfFluidDynamicsWorld ()->getHfFluidArray (); + btHfFluid* fluid = fluids[0]; + + for (int i = 26; i < 30; i++) + { + fluid->setFluidHeight (i, fluid->getNumNodesLength()-3, btScalar(3.0f)); + } +} + + +void Run_RandomDrops (HfFluidDemo* fluidDemo) +{ + static btScalar dtSinceLastDrop = btScalar(0.0f); + btScalar dt = btScalar(1.0/60.); + + + btHfFluidArray& fluids = fluidDemo->getHfFluidDynamicsWorld ()->getHfFluidArray (); + btHfFluid* fluid = fluids[0]; + + if (dtSinceLastDrop > btScalar(0.5f)) + { + dtSinceLastDrop = btScalar(0.0f); + int randomXNode = GEN_rand () % (fluid->getNumNodesWidth()-2); + int randomZNode = GEN_rand () % (fluid->getNumNodesLength()-2); + if (randomXNode <= 1) + randomXNode = 2; + if (randomZNode <= 1) + randomZNode = 2; + + btScalar* eta = fluid->getEtaArray (); + btScalar* height = fluid->getHeightArray (); + const btScalar* ground = fluid->getGroundArray (); + bool* flags = fluid->getFlagsArray(); + int index = fluid->arrayIndex (randomXNode, randomZNode); + eta[index] += btScalar(4.5f); + eta[index-1] += btScalar(2.25f); + eta[index+1] += btScalar(2.25f); + eta[index+fluid->getNumNodesWidth()] += btScalar(2.25f); + eta[index-fluid->getNumNodesWidth()] += btScalar(2.25f); + height[index] = eta[index] + ground[index]; + height[index-1] = eta[index-1] + ground[index-1]; + height[index+1] = eta[index+1] + ground[index+1]; + height[index+fluid->getNumNodesWidth()] = eta[index+fluid->getNumNodesWidth()] + ground[index+fluid->getNumNodesWidth()]; + height[index-fluid->getNumNodesWidth()] = eta[index-fluid->getNumNodesWidth()] + ground[index-fluid->getNumNodesWidth()]; + flags[index] = true; + flags[index-1] = true; + flags[index+1] = true; + flags[index+fluid->getNumNodesWidth()] = true; + flags[index-fluid->getNumNodesWidth()] = true; + } else { + dtSinceLastDrop += dt; + } +} + +void Init_Fill (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0f), 75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(-5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->getEtaArray()[i] = btScalar(0.0f); + } + fluid->prep (); +} + +void Run_Fill (HfFluidDemo* fluidDemo) +{ + static btScalar dtSinceLastDrop = btScalar(0.0f); + btScalar dt = btScalar(1.0/60.); + + btHfFluidArray& fluids = fluidDemo->getHfFluidDynamicsWorld ()->getHfFluidArray (); + btHfFluid* fluid = fluids[0]; + + if (dtSinceLastDrop > btScalar(0.25f)) + { + dtSinceLastDrop = btScalar(0.0f); + + btScalar* eta = fluid->getEtaArray (); + btScalar* velocityU = fluid->getVelocityUArray (); + btScalar* velocityV = fluid->getVelocityVArray (); + btScalar* height = fluid->getHeightArray (); + const btScalar* ground = fluid->getGroundArray (); + bool* flags = fluid->getFlagsArray(); + int index = fluid->arrayIndex (fluid->getNumNodesWidth()/2, fluid->getNumNodesLength()/2); + eta[index] += btScalar(4.5f); + eta[index-1] += btScalar(2.25f); + eta[index+1] += btScalar(2.25f); + eta[index+fluid->getNumNodesWidth()] += btScalar(2.25f); + eta[index-fluid->getNumNodesWidth()] += btScalar(2.25f); + + velocityU[index] = btScalar(0.0f); + velocityU[index-1] = btScalar(-10.0f); + velocityU[index+1] = btScalar(10.0f); + velocityU[index+fluid->getNumNodesWidth()] = btScalar(0.0f); + velocityU[index-fluid->getNumNodesWidth()] = btScalar(0.0f); + + velocityV[index] = btScalar(0.0f); + velocityV[index-1] = btScalar(0.0f); + velocityV[index+1] = btScalar(0.0f); + velocityV[index+fluid->getNumNodesWidth()] = btScalar(10.0f); + velocityV[index-fluid->getNumNodesWidth()] = btScalar(-10.0f); + + height[index] = eta[index] + ground[index]; + height[index-1] = eta[index-1] + ground[index-1]; + height[index+1] = eta[index+1] + ground[index+1]; + height[index+fluid->getNumNodesWidth()] = eta[index+fluid->getNumNodesWidth()] + ground[index+fluid->getNumNodesWidth()]; + height[index-fluid->getNumNodesWidth()] = eta[index-fluid->getNumNodesWidth()] + ground[index-fluid->getNumNodesWidth()]; + flags[index] = true; + flags[index-1] = true; + flags[index+1] = true; + flags[index+fluid->getNumNodesWidth()] = true; + flags[index-fluid->getNumNodesWidth()] = true; + } else { + dtSinceLastDrop += dt; + } + +} + +void Init_BlockWave (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0), 75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(-5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + btScalar* eta = fluid->getEtaArray (); + + for (int i = 0; i < fluid->getNumNodesLength() * fluid->getNumNodesWidth(); i++) + { + eta[i] = btScalar(12.0f); + } + + for (int i = fluid->getNumNodesWidth()/8; i < fluid->getNumNodesWidth()/4; i++) + { + for (int j = fluid->getNumNodesLength()/8; j < fluid->getNumNodesLength()/4; j++) + { + int index = fluid->arrayIndex(i, j); + eta[index] = btScalar(4.0f); + } + } + fluid->prep (); + + { + btConvexShape* colShape = new btSphereShape(btScalar(1.)); + btHfFluidBuoyantConvexShape* buoyantShape = new btHfFluidBuoyantConvexShape(colShape); + buoyantShape->generateShape (btScalar(0.25f), btScalar(0.05f)); + fluidDemo->m_collisionShapes.push_back(buoyantShape); + fluidDemo->m_collisionShapes.push_back(colShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + colShape->calculateLocalInertia(mass,localInertia); + + int gridSize = 2; + btScalar startPosX = btScalar(-10.0f); + btScalar startPosY = btScalar(2.0f); + btScalar startPosZ = btScalar(-10.f); + float start_x = startPosX - gridSize/2; + float start_y = startPosY; + float start_z = startPosZ - gridSize/2; + + for (int k=0;kgetHfFluidDynamicsWorld()->addRigidBody(body); + } + } + } + } +} + +void Init_Ground (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0f),75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + btScalar* eta = fluid->getEtaArray (); + + for (int i = 0; i < fluid->getNumNodesLength() * fluid->getNumNodesWidth(); i++) + { + eta[i] = btScalar(4.0f); + } + + btScalar* ground = fluid->getGroundArray (); + for (int i = 0; i < fluid->getNumNodesWidth(); i++) + { + for (int j = 0; j < fluid->getNumNodesLength(); j++) + { + int index = fluid->arrayIndex (i, j); + + if (j <= fluid->getNumNodesLength()/2) + { + + ground[index] = btScalar(5.0f); + } else if (j > (fluid->getNumNodesLength()/8*6)) { + ground[index] = btScalar(0.0f); + } else { + ground[index] = btScalar(6.5f); + } + + if (j <= fluid->getNumNodesLength()/4 && j > fluid->getNumNodesLength()/8) + { + eta[index] = btScalar(8.0f); + } else if (j <= fluid->getNumNodesLength()/8) + { + eta[index] = btScalar(20.0f); + } else { + eta[index] = btScalar(0.0f); + } + + } + } + fluid->prep (); +} + +void Init_Ground2 (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0f), 75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + btScalar* eta = fluid->getEtaArray (); + + for (int i = 0; i < fluid->getNumNodesLength() * fluid->getNumNodesWidth(); i++) + { + eta[i] = btScalar(4.0f); + } + + btScalar* ground = fluid->getGroundArray (); + for (int i = 0; i < fluid->getNumNodesWidth(); i++) + { + for (int j = 0; j < fluid->getNumNodesLength(); j++) + { + int index = fluid->arrayIndex (i, j); + + ground[index] = (btScalar(j)/fluid->getNumNodesLength()-1)*btScalar(8.0f); + } + } + + for (int i = 0; i < fluid->getNumNodesLength() * fluid->getNumNodesWidth(); i++) + { + eta[i] = btScalar(2.0f); + } + + for (int i = fluid->getNumNodesWidth()/8; i < fluid->getNumNodesWidth()/4; i++) + { + for (int j = fluid->getNumNodesLength()/8; j < fluid->getNumNodesLength()/4; j++) + { + int index = fluid->arrayIndex(i, j); + eta[index] = btScalar(8.0f); + } + } + fluid->prep (); +} + +void Init_Fill2 (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0), 100, 100); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(-5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->getEtaArray()[i] = btScalar(0.0f); + } + fluid->prep (); +} + +void Run_Fill2 (HfFluidDemo* fluidDemo) +{ + static btScalar dtSinceLastDrop = btScalar(0.0f); + btScalar dt = btScalar(1.0/60.); + + btHfFluidArray& fluids = fluidDemo->getHfFluidDynamicsWorld ()->getHfFluidArray (); + btHfFluid* fluid = fluids[0]; + + if (dtSinceLastDrop > btScalar(0.25f)) + { + dtSinceLastDrop = btScalar(0.0f); + + btScalar* eta = fluid->getEtaArray (); + btScalar* velocityU = fluid->getVelocityUArray (); + btScalar* velocityV = fluid->getVelocityVArray (); + btScalar* height = fluid->getHeightArray (); + const btScalar* ground = fluid->getGroundArray (); + bool* flags = fluid->getFlagsArray(); + + for (int i = 1; i < fluid->getNumNodesWidth()-1; i++) + { + int index = fluid->arrayIndex (i, 1); + eta[index] += btScalar(3.0f); + velocityU[index] = btScalar(4.0f); + height[index] = ground[index] + eta[index]; + flags[index] = true; + } + } else { + dtSinceLastDrop += dt; + } + +} + +void Init_MovingPour (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0),75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(-5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->getEtaArray()[i] = btScalar(5.0f); + } + + + fluid->prep (); + { + //create a few dynamic rigidbodies + // Re-using the same collision is better for memory usage and performance + + btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1)); + //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + fluidDemo->m_collisionShapes.push_back(colShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + colShape->calculateLocalInertia(mass,localInertia); + + float start_x = START_POS_X - ARRAY_SIZE_X/2; + float start_y = START_POS_Y; + float start_z = START_POS_Z - ARRAY_SIZE_Z/2; + + for (int k=0;kgetHfFluidDynamicsWorld()->addRigidBody(body); + } + } + } + } +} + +void Run_MovingPour(HfFluidDemo* fluidDemo) +{ + static btScalar dtSinceLastDrop = btScalar(0.0f); + static btScalar x = 4; + static btScalar z = 4; + static btScalar dx = btScalar(20.0f); + static btScalar dz = btScalar(30.0f); + btScalar dt = btScalar(1.0/60.); + + btHfFluidArray& fluids = fluidDemo->getHfFluidDynamicsWorld ()->getHfFluidArray (); + btHfFluid* fluid = fluids[0]; + + int minX = 2; + int minZ = 2; + int maxX = fluid->getNumNodesWidth() - 2; + int maxZ = fluid->getNumNodesLength() - 2; + + x += dx * dt; + + if (x <= minX) + { + dx *= btScalar(-1.0f); + x = minX; + } else if (x >= maxX) { + dx *= btScalar(-1.0f); + x = maxX; + } + z += dz * dt; + + if (z <= minZ) + { + dz *= btScalar(-1.0f); + z = minZ; + } else if (z >= maxZ) { + dz *= btScalar(-1.0f); + z = maxZ; + } + + const btScalar dropHeight = btScalar(3.0f); + + { + int iX = (int)x; + int iZ = (int)z; + fluid->addFluidHeight (iX,iZ, dropHeight); + //fluid->addFluidHeight (x, z+1, dropHeight); + //fluid->addFluidHeight (x+1, z, dropHeight); + //fluid->addFluidHeight (x+1, z+1, dropHeight); + } +} + +#define NUM_DEMOS 12 + +void (*demo_run_functions[NUM_DEMOS])(HfFluidDemo*)= +{ + NULL, // Run_Floatyness + NULL, // Run_Bowl + Run_FillPool, //Run_FillPool + NULL, // Run_Drops + NULL, // Run_Wave + Run_RandomDrops, + Run_Fill, + Run_Fill2, + NULL, // Run_BlockWave + NULL, // Run_Ground + NULL, // Run_Ground2 + Run_MovingPour, +}; +void (*demo_init_functions[NUM_DEMOS])(HfFluidDemo*)= +{ + Init_Floatyness, + Init_Bowl, + Init_FillPool, + Init_Drops, + Init_Wave, + Init_RandomDrops, + Init_Fill, + Init_Fill2, + Init_BlockWave, + Init_Ground, + Init_Ground2, + Init_MovingPour, +}; + +#ifdef _DEBUG +const int gNumObjects = 1; +#else +const int gNumObjects = 1;//try this in release mode: 3000. never go above 16384, unless you increate maxNumObjects value in DemoApplication.cp +#endif + +const int maxNumObjects = 32760; + +#define CUBE_HALF_EXTENTS 1.5 +#define EXTRA_HEIGHT -10.f + +// +void HfFluidDemo::createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ) +{ + btTransform trans; + trans.setIdentity(); + + for(int i=0; igenerateShape (btScalar(0.25f), btScalar(0.05f)); + m_shootBoxShape = buoyantShape; + } +} + +//////////////////////////////////// + +extern int gNumManifold; +extern int gOverlappingPairs; + +void HfFluidDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); + + + float dt = 1.0/60.; + + if (m_dynamicsWorld) + { + if (demo_run_functions[current_demo]) + { + demo_run_functions[current_demo](this); + } + } + + if (m_dynamicsWorld) + { + if(m_drag) + { + const int x=m_lastmousepos[0]; + const int y=m_lastmousepos[1]; + const btVector3 rayFrom=m_cameraPosition; + const btVector3 rayTo=getRayTo(x,y); + const btVector3 rayDir=(rayTo-rayFrom).normalized(); + const btVector3 N=(m_cameraTargetPosition-m_cameraPosition).normalized(); + const btScalar O=dot(m_impact,N); + const btScalar den=dot(N,rayDir); + if((den*den)>0) + { + const btScalar num=O-dot(N,rayFrom); + const btScalar hit=num/den; + if((hit>0)&&(hit<1500)) + { + m_goal=rayFrom+rayDir*hit; + } + } + btVector3 delta; + static const btScalar maxdrag=10; + if(delta.length2()>(maxdrag*maxdrag)) + { + delta=delta.normalized()*maxdrag; + } + } + +#define FIXED_STEP +#ifdef FIXED_STEP + m_dynamicsWorld->stepSimulation(dt=1.0f/60.f,0); + +#else + //during idle mode, just run 1 simulation step maximum, otherwise 4 at max + int maxSimSubSteps = m_idle ? 1 : 4; + //if (m_idle) + // dt = 1.0/420.f; + + int numSimSteps; + numSimSteps = m_dynamicsWorld->stepSimulation(dt); + +#ifdef VERBOSE_TIMESTEPPING_CONSOLEOUTPUT + if (!numSimSteps) + printf("Interpolated transforms\n"); + else + { + if (numSimSteps > maxSimSubSteps) + { + //detect dropping frames + printf("Dropped (%i) simulation steps out of %i\n",numSimSteps - maxSimSubSteps,numSimSteps); + } else + { + printf("Simulated (%i) steps\n",numSimSteps); + } + } +#endif //VERBOSE_TIMESTEPPING_CONSOLEOUTPUT + +#endif + + //optional but useful: debug drawing + + } + +#ifdef USE_QUICKPROF + btProfiler::beginBlock("render"); +#endif //USE_QUICKPROF + + renderme(); + + //render the graphics objects, with center of mass shift + + updateCamera(); + + + +#ifdef USE_QUICKPROF + btProfiler::endBlock("render"); +#endif + glFlush(); + //some additional debugging info +#ifdef PRINT_CONTACT_STATISTICS + printf("num manifolds: %i\n",gNumManifold); + printf("num gOverlappingPairs: %i\n",gOverlappingPairs); + printf("num gTotalContactPoints : %i\n",gTotalContactPoints ); +#endif //PRINT_CONTACT_STATISTICS + + //gTotalContactPoints = 0; + glutSwapBuffers(); + +} + + + +void HfFluidDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + renderme(); + + glFlush(); + glutSwapBuffers(); +} + + + + +void HfFluidDemo::clientResetScene() +{ + DemoApplication::clientResetScene(); + /* Clean up */ + for(int i=m_dynamicsWorld->getNumCollisionObjects()-1;i>0;i--) + { + btCollisionObject* obj=m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body=btRigidBody::upcast(obj); + if(body&&body->getMotionState()) + { + delete body->getMotionState(); + } + while(m_dynamicsWorld->getNumConstraints()) + { + btTypedConstraint* pc=m_dynamicsWorld->getConstraint(0); + m_dynamicsWorld->removeConstraint(pc); + delete pc; + } + btHfFluid* hfFluid = btHfFluid::upcast(obj); + if (hfFluid) + { + getHfFluidDynamicsWorld()->removeHfFluid(hfFluid); + } else + { + m_dynamicsWorld->removeCollisionObject(obj); + } + delete obj; + } + + /* Init */ + + + m_autocam = false; + m_raycast = false; + m_cutting = false; + printf("current_demo = %d\n", current_demo); + demo_init_functions[current_demo](this); +} + +void HfFluidDemo::renderme() +{ + btIDebugDraw* idraw=m_dynamicsWorld->getDebugDrawer(); + + m_dynamicsWorld->debugDrawWorld(); + + /* Bodies */ + btVector3 ps(0,0,0); + int nps=0; + + DemoApplication::renderme(); +} + + +void HfFluidDemo::keyboardCallback(unsigned char key, int x, int y) +{ + switch(key) + { + case ']': + current_demo = (current_demo+1)%NUM_DEMOS; + clientResetScene(); + break; + case '[': + current_demo = (current_demo-1)%NUM_DEMOS; + clientResetScene(); + break; + case '.': + current_draw_mode = (current_draw_mode+1) % DRAWMODE_MAX; + getHfFluidDynamicsWorld()->setDrawMode (current_draw_mode); + break; + case 'v': + current_body_draw_mode = (current_body_draw_mode+1) % BODY_DRAWMODE_MAX; + getHfFluidDynamicsWorld()->setBodyDrawMode (current_body_draw_mode); + break; + default: + DemoApplication::keyboardCallback(key,x,y); + break; + } +} + +// +void HfFluidDemo::mouseMotionFunc(int x,int y) +{ + DemoApplication::mouseMotionFunc(x,y); +} + +// +void HfFluidDemo::mouseFunc(int button, int state, int x, int y) +{ +if(button==0) + { + switch(state) + { + case 0: + { + DemoApplication::mouseFunc(button,state,x,y); + } + break; + case 1: + DemoApplication::mouseFunc(button,state,x,y); + break; + } + } + else + { + DemoApplication::mouseFunc(button,state,x,y); + } +} + + +void HfFluidDemo::initPhysics() +{ +///create concave ground mesh + + btCollisionShape* groundShape = 0; + bool useConcaveMesh = false;//not ready yet true; + + if (useConcaveMesh) + { + int i; + int j; + + const int NUM_VERTS_X = 30; + const int NUM_VERTS_Y = 30; + const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + + gGroundVertices = new btVector3[totalVerts]; + gGroundIndices = new int[totalTriangles*3]; + + btScalar offset(-50); + + for ( i=0;iaddChildShape(localTransform,cylinderShape); + btQuaternion orn(btVector3(0,1,0),SIMD_PI); + localTransform.setRotation(orn); + cylinderCompound->addChildShape(localTransform,cylinderShape); + + m_collisionShapes.push_back(cylinderCompound); + + + m_dispatcher=0; + + /* FIXME: Register new collision algorithm */ + ///register some softbody collision algorithms on top of the default btDefaultCollisionConfiguration + m_collisionConfiguration = new btHfFluidRigidCollisionConfiguration(); + + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + //////////////////////////// + ///Register HfFluid versus rigidbody collision algorithm + + + btVector3 worldAabbMin(-1000,-1000,-1000); + btVector3 worldAabbMax(1000,1000,1000); + + m_broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); + + btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver(); + + m_solver = solver; + + btDiscreteDynamicsWorld* world = new btHfFluidRigidDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + m_dynamicsWorld = world; + + + m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(0,-12,0)); + + + + localCreateRigidBody(0.f,tr,m_collisionShapes[0]); + + + // clientResetScene(); + + clientResetScene(); +} + + + + + + +void HfFluidDemo::exitPhysics() +{ + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_FluidRigidCollisionAlgorithms; + + + bool m_autocam; + bool m_cutting; + bool m_raycast; + btScalar m_animtime; + btClock m_clock; + int m_lastmousepos[2]; + btVector3 m_impact; + btVector3 m_goal; + bool m_drag; + + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + + btConstraintSolver* m_solver; + + btCollisionAlgorithmCreateFunc* m_boxBoxCF; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + +public: + + void initPhysics(); + + void exitPhysics(); + + HfFluidDemo (); + + virtual ~HfFluidDemo() + { + exitPhysics(); + } + + virtual void setDrawClusters(bool drawClusters) + { + + } + + virtual void setShootBoxShape (); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + void createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ); + + static DemoApplication* Create() + { + HfFluidDemo* demo = new HfFluidDemo; + demo->myinit(); + demo->initPhysics(); + return demo; + } + + virtual const btHfFluidRigidDynamicsWorld* getHfFluidDynamicsWorld() const + { + ///just make it a btSoftRigidDynamicsWorld please + ///or we will add type checking + return (btHfFluidRigidDynamicsWorld*) m_dynamicsWorld; + } + + virtual btHfFluidRigidDynamicsWorld* getHfFluidDynamicsWorld() + { + ///just make it a btSoftRigidDynamicsWorld please + ///or we will add type checking + return (btHfFluidRigidDynamicsWorld*) m_dynamicsWorld; + } + + // + void clientResetScene(); + void renderme(); + void keyboardCallback(unsigned char key, int x, int y); + void mouseFunc(int button, int state, int x, int y); + void mouseMotionFunc(int x,int y); + +}; + +#define MACRO_SOFT_DEMO(a) class HfFluidDemo##a : public HfFluidDemo\ +{\ +public:\ + static DemoApplication* Create()\ + {\ + HfFluidDemo* demo = new HfFluidDemo##a;\ + extern unsigned int current_demo;\ + current_demo=a;\ + demo->myinit();\ + demo->initPhysics();\ + return demo;\ + }\ +}; + + +MACRO_SOFT_DEMO(0) //Init_Drops +MACRO_SOFT_DEMO(1) //Init_Wave +MACRO_SOFT_DEMO(2) //Init_RandomDrops +MACRO_SOFT_DEMO(3) + +#endif //CCD_PHYSICS_DEMO_H + + + + + diff --git a/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.cpp b/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.cpp new file mode 100644 index 000000000..737ee7de9 --- /dev/null +++ b/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.cpp @@ -0,0 +1,604 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +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. +*/ + +#ifdef WIN32 //needed for glut.h +#include +#endif + +//think different +#if defined(__APPLE__) && !defined (VMDMESA) +#include +#include +#include +#else +#include +#endif + +#include "GlutStuff.h" +#include "HfFluidDemo_GL_ShapeDrawer.h" + +#include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h" +#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/CollisionShapes/btConeShape.h" +#include "BulletCollision/CollisionShapes/btCylinderShape.h" +#include "BulletCollision/CollisionShapes/btTetrahedronShape.h" +#include "BulletCollision/CollisionShapes/btCompoundShape.h" +#include "BulletCollision/CollisionShapes/btCapsuleShape.h" +#include "BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h" +#include "BulletCollision/CollisionShapes/btUniformScalingShape.h" +#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h" +/// +#include "BulletCollision/CollisionShapes/btShapeHull.h" +#include "BulletHfFluid/btHfFluidBuoyantConvexShape.h" +#include "BulletHfFluid/btHfFluid.h" +#include "BulletHfFluid/btHfFluidCollisionShape.h" + +#include "LinearMath/btTransformUtil.h" + + +#include "LinearMath/btIDebugDraw.h" +//for debugmodes +#include "BMF_Api.h" +#include //printf debugging + +#include + +using namespace std; + + +class GlDrawcallback : public btTriangleCallback +{ + +public: + + bool m_wireframe; + + GlDrawcallback() + :m_wireframe(false) + { + } + + virtual void processTriangle(btVector3* triangle,int partId, int triangleIndex) + { + + (void)triangleIndex; + (void)partId; + + + if (m_wireframe) + { + glBegin(GL_LINES); + glColor3f(1, 0, 0); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(0, 1, 0); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(0, 0, 1); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glEnd(); + } else + { + glBegin(GL_TRIANGLES); + //glColor3f(1, 1, 1); + + + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glEnd(); + } + } +}; + +class TriangleGlDrawcallback : public btInternalTriangleIndexCallback +{ +public: + virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex) + { + (void)triangleIndex; + (void)partId; + + + glBegin(GL_TRIANGLES);//LINES); + glColor3f(1, 0, 0); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(0, 1, 0); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(0, 0, 1); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glEnd(); + } +}; + + + +void HfFluidDemo_GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax) +{ + + + glPushMatrix(); + btglMultMatrix(m); + + if (shape->getShapeType() == UNIFORM_SCALING_SHAPE_PROXYTYPE) + { + const btUniformScalingShape* scalingShape = static_cast(shape); + const btConvexShape* convexShape = scalingShape->getChildShape(); + float scalingFactor = (float)scalingShape->getUniformScalingFactor(); + { + btScalar tmpScaling[4][4]={{scalingFactor,0,0,0}, + {0,scalingFactor,0,0}, + {0,0,scalingFactor,0}, + {0,0,0,1}}; + + drawOpenGL( (btScalar*)tmpScaling,convexShape,color,debugMode,worldBoundsMin,worldBoundsMax); + } + glPopMatrix(); + return; + } + + if (shape->getShapeType() == HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE) + { + btConvexShape* convexShape = ((btHfFluidBuoyantConvexShape*)shape)->getConvexShape(); + btTransform I; + I.setIdentity(); + btScalar mat[16]; + I.getOpenGLMatrix (&mat[0]); + drawOpenGL (mat, convexShape, color, debugMode, worldBoundsMin, worldBoundsMax); + return; + } + + if (shape->getShapeType() == COMPOUND_SHAPE_PROXYTYPE) + { + const btCompoundShape* compoundShape = static_cast(shape); + for (int i=compoundShape->getNumChildShapes()-1;i>=0;i--) + { + btTransform childTrans = compoundShape->getChildTransform(i); + const btCollisionShape* colShape = compoundShape->getChildShape(i); + btScalar childMat[16]; + childTrans.getOpenGLMatrix(childMat); + drawOpenGL(childMat,colShape,color,debugMode,worldBoundsMin,worldBoundsMax); + + } + + } else + { + if(m_textureenabled&&(!m_textureinitialized)) + { + GLubyte* image=new GLubyte[256*256*3]; + for(int y=0;y<256;++y) + { + const int t=y>>4; + GLubyte* pi=image+y*256*3; + for(int x=0;x<256;++x) + { + const int s=x>>4; + const GLubyte b=180; + GLubyte c=b+((s+t&1)&1)*(255-b); + pi[0]=pi[1]=pi[2]=c;pi+=3; + } + } + glGenTextures(1,(GLuint*)&m_texturehandle); + glBindTexture(GL_TEXTURE_2D,m_texturehandle); + glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); + glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); + glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR); + glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); + glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); + gluBuild2DMipmaps(GL_TEXTURE_2D,3,256,256,GL_RGB,GL_UNSIGNED_BYTE,image); + delete[] image; + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glScalef(0.025,0.025,0.025); + + static const GLfloat planex[]={1,0,0,0}; + static const GLfloat planey[]={0,1,0,0}; + static const GLfloat planez[]={0,0,1,0}; + glTexGenfv(GL_S,GL_OBJECT_PLANE,planex); + glTexGenfv(GL_T,GL_OBJECT_PLANE,planez); + glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); + glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + glEnable(GL_TEXTURE_GEN_R); + m_textureinitialized=true; + } + //drawCoordSystem(); + + //glPushMatrix(); + glEnable(GL_COLOR_MATERIAL); + if(m_textureenabled) + { + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D,m_texturehandle); + } else + { + glDisable(GL_TEXTURE_2D); + } + + + glColor3f(color.x(),color.y(), color.z()); + + bool useWireframeFallback = true; + + if (!(debugMode & btIDebugDraw::DBG_DrawWireframe)) + { + ///you can comment out any of the specific cases, and use the default + ///the benefit of 'default' is that it approximates the actual collision shape including collision margin + int shapetype=m_textureenabled?MAX_BROADPHASE_COLLISION_TYPES:shape->getShapeType(); + switch (shapetype) + { + case BOX_SHAPE_PROXYTYPE: + { + const btBoxShape* boxShape = static_cast(shape); + btVector3 halfExtent = boxShape->getHalfExtentsWithMargin(); + glScaled(2*halfExtent[0], 2*halfExtent[1], 2*halfExtent[2]); + glutSolidCube(1.0); + useWireframeFallback = false; + break; + } + + + case SPHERE_SHAPE_PROXYTYPE: + { + const btSphereShape* sphereShape = static_cast(shape); + float radius = sphereShape->getMargin();//radius doesn't include the margin, so draw with margin + glutSolidSphere(radius,10,10); + useWireframeFallback = false; + break; + } + + case CONE_SHAPE_PROXYTYPE: + { + const btConeShape* coneShape = static_cast(shape); + int upIndex = coneShape->getConeUpIndex(); + float radius = coneShape->getRadius();//+coneShape->getMargin(); + float height = coneShape->getHeight();//+coneShape->getMargin(); + switch (upIndex) + { + case 0: + glRotatef(90.0, 0.0, 1.0, 0.0); + break; + case 1: + glRotatef(-90.0, 1.0, 0.0, 0.0); + break; + case 2: + break; + default: + { + } + }; + + glTranslatef(0.0, 0.0, -0.5*height); + glutSolidCone(radius,height,10,10); + useWireframeFallback = false; + break; + + } + + + case STATIC_PLANE_PROXYTYPE: + { + const btStaticPlaneShape* staticPlaneShape = static_cast(shape); + btScalar planeConst = staticPlaneShape->getPlaneConstant(); + const btVector3& planeNormal = staticPlaneShape->getPlaneNormal(); + btVector3 planeOrigin = planeNormal * planeConst; + btVector3 vec0,vec1; + btPlaneSpace1(planeNormal,vec0,vec1); + btScalar vecLen = 100.f; + btVector3 pt0 = planeOrigin + vec0*vecLen; + btVector3 pt1 = planeOrigin - vec0*vecLen; + btVector3 pt2 = planeOrigin + vec1*vecLen; + btVector3 pt3 = planeOrigin - vec1*vecLen; + glBegin(GL_LINES); + glVertex3f(pt0.getX(),pt0.getY(),pt0.getZ()); + glVertex3f(pt1.getX(),pt1.getY(),pt1.getZ()); + glVertex3f(pt2.getX(),pt2.getY(),pt2.getZ()); + glVertex3f(pt3.getX(),pt3.getY(),pt3.getZ()); + glEnd(); + + + break; + + } + + case CYLINDER_SHAPE_PROXYTYPE: + { + const btCylinderShape* cylinder = static_cast(shape); + int upAxis = cylinder->getUpAxis(); + + + float radius = cylinder->getRadius(); + float halfHeight = cylinder->getHalfExtentsWithMargin()[upAxis]; + + drawCylinder(radius,halfHeight,upAxis); + + break; + } + + default: + { + + + if (shape->isConvex()) + { + ShapeCache* sc=cache((btConvexShape*)shape); + + //if (shape->getUserPointer()) + { + //glutSolidCube(1.0); + btShapeHull* hull = &sc->m_shapehull/*(btShapeHull*)shape->getUserPointer()*/; + + + if (hull->numTriangles () > 0) + { + int index = 0; + const unsigned int* idx = hull->getIndexPointer(); + const btVector3* vtx = hull->getVertexPointer(); + + glBegin (GL_TRIANGLES); + + for (int i = 0; i < hull->numTriangles (); i++) + { + int i1 = index++; + int i2 = index++; + int i3 = index++; + btAssert(i1 < hull->numIndices () && + i2 < hull->numIndices () && + i3 < hull->numIndices ()); + + int index1 = idx[i1]; + int index2 = idx[i2]; + int index3 = idx[i3]; + btAssert(index1 < hull->numVertices () && + index2 < hull->numVertices () && + index3 < hull->numVertices ()); + + btVector3 v1 = vtx[index1]; + btVector3 v2 = vtx[index2]; + btVector3 v3 = vtx[index3]; + btVector3 normal = (v3-v1).cross(v2-v1); + normal.normalize (); + + glNormal3f(normal.getX(),normal.getY(),normal.getZ()); + glVertex3f (v1.x(), v1.y(), v1.z()); + glVertex3f (v2.x(), v2.y(), v2.z()); + glVertex3f (v3.x(), v3.y(), v3.z()); + + } + glEnd (); + + } + } + } + } + } + + } + + + + + /// for polyhedral shapes + if (debugMode==btIDebugDraw::DBG_DrawFeaturesText && (shape->isPolyhedral())) + { + btPolyhedralConvexShape* polyshape = (btPolyhedralConvexShape*) shape; + + { + glRasterPos3f(0.0, 0.0, 0.0); + //BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),polyshape->getExtraDebugInfo()); + + glColor3f(1.f, 1.f, 1.f); + int i; + for (i=0;igetNumVertices();i++) + { + btVector3 vtx; + polyshape->getVertex(i,vtx); + glRasterPos3f(vtx.x(), vtx.y(), vtx.z()); + char buf[12]; + sprintf(buf," %d",i); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + } + + for (i=0;igetNumPlanes();i++) + { + btVector3 normal; + btVector3 vtx; + polyshape->getPlane(normal,vtx,i); + btScalar d = vtx.dot(normal); + + glRasterPos3f(normal.x()*d, normal.y()*d, normal.z()*d); + char buf[12]; + sprintf(buf," plane %d",i); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + + } + } + + } + + +#ifdef USE_DISPLAY_LISTS + + if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE||shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE) + { + GLuint dlist = OGL_get_displaylist_for_shape((btCollisionShape * )shape); + if (dlist) + { + glCallList(dlist); + } + else + { +#else + if (shape->isConcave())//>getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE||shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE) + // if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btConcaveShape* concaveMesh = (btConcaveShape*) shape; + + GlDrawcallback drawCallback; + drawCallback.m_wireframe = (debugMode & btIDebugDraw::DBG_DrawWireframe)!=0; + + concaveMesh->processAllTriangles(&drawCallback,worldBoundsMin,worldBoundsMax); + + } + if (shape->getShapeType() == HFFLUID_SHAPE_PROXYTYPE) + { + btHfFluidCollisionShape* hfFluidShape = (btHfFluidCollisionShape*)shape; + btHfFluid* fluid = hfFluidShape->m_fluid; + + GlDrawcallback drawCallback; + drawCallback.m_wireframe = (debugMode & btIDebugDraw::DBG_DrawWireframe) != 0; + fluid->foreachSurfaceTriangle (&drawCallback, worldBoundsMin, worldBoundsMax); + } +#endif + +#ifdef USE_DISPLAY_LISTS + } +} +#endif + +/* +if (shape->getShapeType() == CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE) +{ +btConvexTriangleMeshShape* convexMesh = (btConvexTriangleMeshShape*) shape; + +//todo: pass camera for some culling +btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30)); +btVector3 aabbMin(-btScalar(1e30),-btScalar(1e30),-btScalar(1e30)); +TriangleGlDrawcallback drawCallback; +convexMesh->getMeshInterface()->InternalProcessAllTriangles(&drawCallback,aabbMin,aabbMax); + +} +*/ + + + +glDisable(GL_DEPTH_TEST); +glRasterPos3f(0,0,0);//mvtx.x(), vtx.y(), vtx.z()); +if (debugMode&btIDebugDraw::DBG_DrawText) +{ + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),shape->getName()); +} + +if (debugMode& btIDebugDraw::DBG_DrawFeaturesText) +{ + //BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),shape->getExtraDebugInfo()); +} +glEnable(GL_DEPTH_TEST); + +// glPopMatrix(); +if(m_textureenabled) glDisable(GL_TEXTURE_2D); + } + glPopMatrix(); + +} + +// +void HfFluidDemo_GL_ShapeDrawer::drawShadow(btScalar* m,const btVector3& extrusion,const btCollisionShape* shape,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax) +{ + glPushMatrix(); + btglMultMatrix(m); + if(shape->getShapeType() == UNIFORM_SCALING_SHAPE_PROXYTYPE) + { + const btUniformScalingShape* scalingShape = static_cast(shape); + const btConvexShape* convexShape = scalingShape->getChildShape(); + float scalingFactor = (float)scalingShape->getUniformScalingFactor(); + btScalar tmpScaling[4][4]={ {scalingFactor,0,0,0}, + {0,scalingFactor,0,0}, + {0,0,scalingFactor,0}, + {0,0,0,1}}; + drawShadow((btScalar*)tmpScaling,extrusion,convexShape,worldBoundsMin,worldBoundsMax); + glPopMatrix(); + return; + } + else if(shape->getShapeType()==COMPOUND_SHAPE_PROXYTYPE) + { + const btCompoundShape* compoundShape = static_cast(shape); + for (int i=compoundShape->getNumChildShapes()-1;i>=0;i--) + { + btTransform childTrans = compoundShape->getChildTransform(i); + const btCollisionShape* colShape = compoundShape->getChildShape(i); + btScalar childMat[16]; + childTrans.getOpenGLMatrix(childMat); + drawShadow(childMat,extrusion*childTrans.getBasis(),colShape,worldBoundsMin,worldBoundsMax); + } + } + else + { + bool useWireframeFallback = true; + if (shape->isConvex()) + { + ShapeCache* sc=cache((btConvexShape*)shape); + btShapeHull* hull =&sc->m_shapehull; + glBegin(GL_QUADS); + for(int i=0;im_edges.size();++i) + { + const btScalar d=dot(sc->m_edges[i].n[0],extrusion); + if((d*dot(sc->m_edges[i].n[1],extrusion))<0) + { + const int q= d<0?1:0; + const btVector3& a= hull->getVertexPointer()[sc->m_edges[i].v[q]]; + const btVector3& b= hull->getVertexPointer()[sc->m_edges[i].v[1-q]]; + glVertex3f(a[0],a[1],a[2]); + glVertex3f(b[0],b[1],b[2]); + glVertex3f(b[0]+extrusion[0],b[1]+extrusion[1],b[2]+extrusion[2]); + glVertex3f(a[0]+extrusion[0],a[1]+extrusion[1],a[2]+extrusion[2]); + } + } + glEnd(); + } + + } + + + + + if (shape->isConcave())//>getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE||shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE) + // if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btConcaveShape* concaveMesh = (btConcaveShape*) shape; + + GlDrawcallback drawCallback; + drawCallback.m_wireframe = false; + + concaveMesh->processAllTriangles(&drawCallback,worldBoundsMin,worldBoundsMax); + + } + glPopMatrix(); + +} + +// +HfFluidDemo_GL_ShapeDrawer::HfFluidDemo_GL_ShapeDrawer() +{ + m_texturehandle = 0; + m_textureenabled = true; + m_textureinitialized = false; +} + +HfFluidDemo_GL_ShapeDrawer::~HfFluidDemo_GL_ShapeDrawer() +{ +} \ No newline at end of file diff --git a/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.h b/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.h new file mode 100644 index 000000000..a65e8f226 --- /dev/null +++ b/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.h @@ -0,0 +1,33 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef HFFLUID_GL_SHAPE_DRAWER_H +#define HFFLUID_GL_SHAPE_DRAWER_H + +#include "GL_ShapeDrawer.h" + +/// OpenGL shape drawing +class HfFluidDemo_GL_ShapeDrawer : public GL_ShapeDrawer +{ + public: + HfFluidDemo_GL_ShapeDrawer(); + + virtual ~HfFluidDemo_GL_ShapeDrawer(); + + ///drawOpenGL might allocate temporary memoty, stores pointer in shape userpointer + virtual void drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax); + virtual void drawShadow(btScalar* m, const btVector3& extrusion,const btCollisionShape* shape,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax); +}; + +#endif //HFFLUID_GL_SHAPE_DRAWER_H diff --git a/Demos/HeightFieldFluidDemo/Jamfile b/Demos/HeightFieldFluidDemo/Jamfile new file mode 100644 index 000000000..cb5642e9c --- /dev/null +++ b/Demos/HeightFieldFluidDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos HfFluidDemo ; + +BulletHfFluidDemo HfFluidDemo : [ Wildcard *.h *.cpp BulletHfFluid/*.h BulletHfFluid/*.cpp ] ; diff --git a/Demos/HeightFieldFluidDemo/main.cpp b/Demos/HeightFieldFluidDemo/main.cpp new file mode 100644 index 000000000..6bb566fb1 --- /dev/null +++ b/Demos/HeightFieldFluidDemo/main.cpp @@ -0,0 +1,37 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "HfFluidDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + + HfFluidDemo* fluidDemo = new HfFluidDemo(); + + fluidDemo->initPhysics(); + fluidDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + + glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bullet.sf.net",fluidDemo); + + delete fluidDemo; + return 0; + +} diff --git a/Demos/Jamfile b/Demos/Jamfile index 509d8e6ab..b29045e04 100644 --- a/Demos/Jamfile +++ b/Demos/Jamfile @@ -102,4 +102,5 @@ SubInclude TOP Demos Raytracer ; SubInclude TOP Demos SimplexDemo ; SubInclude TOP Demos DoublePrecisionDemo ; SubInclude TOP Demos TerrainDemo ; +SubInclude TOP Demos HeightFieldFluidDemo ; diff --git a/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp b/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp index 8dcfe48db..ff728385f 100644 --- a/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp +++ b/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp @@ -1539,7 +1539,7 @@ void ConcaveDemo::renderme() } } - m_shapeDrawer.drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),worldBoundsMin,worldBoundsMax); } diff --git a/Demos/OpenGL/DemoApplication.cpp b/Demos/OpenGL/DemoApplication.cpp index 41733110c..6fc7fb948 100644 --- a/Demos/OpenGL/DemoApplication.cpp +++ b/Demos/OpenGL/DemoApplication.cpp @@ -82,7 +82,8 @@ m_sundirection(btVector3(1,-2,1)*1000) m_profileIterator = CProfileManager::Get_Iterator(); #endif //BT_NO_PROFILE - m_shapeDrawer.enableTexture(true); + m_shapeDrawer = new GL_ShapeDrawer (); + m_shapeDrawer->enableTexture(true); m_enableshadows = false; } @@ -97,9 +98,18 @@ DemoApplication::~DemoApplication() if (m_shootBoxShape) delete m_shootBoxShape; + if (m_shapeDrawer) + delete m_shapeDrawer; } +void DemoApplication::overrideGLShapeDrawer (GL_ShapeDrawer* shapeDrawer) +{ + shapeDrawer->enableTexture (m_shapeDrawer->hasTextureEnabled()); + delete m_shapeDrawer; + m_shapeDrawer = shapeDrawer; +} + void DemoApplication::myinit(void) { @@ -298,7 +308,7 @@ void DemoApplication::keyboardCallback(unsigned char key, int x, int y) case 'x' : zoomOut(); break; case 'i' : toggleIdle(); break; case 'g' : m_enableshadows=!m_enableshadows;break; - case 'u' : m_shapeDrawer.enableTexture(!m_shapeDrawer.enableTexture(false));break; + case 'u' : m_shapeDrawer->enableTexture(!m_shapeDrawer->enableTexture(false));break; case 'h': if (m_debugMode & btIDebugDraw::DBG_NoHelpText) m_debugMode = m_debugMode & (~btIDebugDraw::DBG_NoHelpText); @@ -510,7 +520,19 @@ void DemoApplication::displayCallback() } - +void DemoApplication::setShootBoxShape () +{ + if (!m_shootBoxShape) + { + //#define TEST_UNIFORM_SCALING_SHAPE 1 +#ifdef TEST_UNIFORM_SCALING_SHAPE + btConvexShape* childShape = new btBoxShape(btVector3(1.f,1.f,1.f)); + m_shootBoxShape = new btUniformScalingShape(childShape,0.5f); +#else + m_shootBoxShape = new btSphereShape(1.f);//BoxShape(btVector3(1.f,1.f,1.f)); +#endif// + } +} void DemoApplication::shootBox(const btVector3& destination) { @@ -523,16 +545,7 @@ void DemoApplication::shootBox(const btVector3& destination) btVector3 camPos = getCameraPosition(); startTransform.setOrigin(camPos); - if (!m_shootBoxShape) - { - //#define TEST_UNIFORM_SCALING_SHAPE 1 -#ifdef TEST_UNIFORM_SCALING_SHAPE - btConvexShape* childShape = new btBoxShape(btVector3(1.f,1.f,1.f)); - m_shootBoxShape = new btUniformScalingShape(childShape,0.5f); -#else - m_shootBoxShape = new btSphereShape(1.f);//BoxShape(btVector3(1.f,1.f,1.f)); -#endif// - } + setShootBoxShape (); btRigidBody* body = this->localCreateRigidBody(mass, startTransform,m_shootBoxShape); @@ -981,9 +994,9 @@ void DemoApplication::renderscene(int pass) switch(pass) { - case 0: m_shapeDrawer.drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),aabbMin,aabbMax);break; - case 1: m_shapeDrawer.drawShadow(m,m_sundirection*rot,colObj->getCollisionShape(),aabbMin,aabbMax);break; - case 2: m_shapeDrawer.drawOpenGL(m,colObj->getCollisionShape(),wireColor*0.3,0,aabbMin,aabbMax);break; + case 0: m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),aabbMin,aabbMax);break; + case 1: m_shapeDrawer->drawShadow(m,m_sundirection*rot,colObj->getCollisionShape(),aabbMin,aabbMax);break; + case 2: m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor*0.3,0,aabbMin,aabbMax);break; } } } diff --git a/Demos/OpenGL/DemoApplication.h b/Demos/OpenGL/DemoApplication.h index c43711c8b..dc697627c 100644 --- a/Demos/OpenGL/DemoApplication.h +++ b/Demos/OpenGL/DemoApplication.h @@ -82,7 +82,7 @@ class DemoApplication void showProfileInfo(float& xOffset,float& yStart, float yIncr); void renderscene(int pass); - GL_ShapeDrawer m_shapeDrawer; + GL_ShapeDrawer* m_shapeDrawer; bool m_enableshadows; btVector3 m_sundirection; @@ -102,15 +102,16 @@ public: } + void overrideGLShapeDrawer (GL_ShapeDrawer* shapeDrawer); void setOrthographicProjection(); void resetPerspectiveProjection(); - bool setTexturing(bool enable) { return(m_shapeDrawer.enableTexture(enable)); } + bool setTexturing(bool enable) { return(m_shapeDrawer->enableTexture(enable)); } bool setShadows(bool enable) { bool p=m_enableshadows;m_enableshadows=enable;return(p); } bool getTexturing() const { - return m_shapeDrawer.hasTextureEnabled(); + return m_shapeDrawer->hasTextureEnabled(); } bool getShadows() const { @@ -176,6 +177,7 @@ public: virtual void clientResetScene(); ///Demo functions + virtual void setShootBoxShape (); void shootBox(const btVector3& destination); diff --git a/Demos/OpenGL/GLDebugDrawer.cpp b/Demos/OpenGL/GLDebugDrawer.cpp index 6811c8bb0..1c768a682 100644 --- a/Demos/OpenGL/GLDebugDrawer.cpp +++ b/Demos/OpenGL/GLDebugDrawer.cpp @@ -21,6 +21,17 @@ GLDebugDrawer::GLDebugDrawer() { } + +void GLDebugDrawer::drawLine(const btVector3& from,const btVector3& to,const btVector3& fromColor, const btVector3& toColor) +{ + glBegin(GL_LINES); + glColor3f(fromColor.getX(), fromColor.getY(), fromColor.getZ()); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glColor3f(toColor.getX(), toColor.getY(), toColor.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + glEnd(); +} + void GLDebugDrawer::drawLine(const btVector3& from,const btVector3& to,const btVector3& color) { // if (m_debugMode > 0) @@ -33,6 +44,30 @@ void GLDebugDrawer::drawLine(const btVector3& from,const btVector3& to,const btV } } +void GLDebugDrawer::drawSphere (const btVector3& p, btScalar radius, const btVector3& color) +{ + glColor4f (color.getX(), color.getY(), color.getZ(), btScalar(1.0f)); + glPushMatrix (); + glTranslatef (p.getX(), p.getY(), p.getZ()); + glutSolidSphere (radius, 10, 10); + glPopMatrix(); +} + +void GLDebugDrawer::drawBox (const btVector3& boxMin, const btVector3& boxMax, const btVector3& color, btScalar alpha) +{ + btVector3 halfExtent = (boxMax - boxMin) * btScalar(0.5f); + btVector3 center = (boxMax + boxMin) * btScalar(0.5f); + //glEnable(GL_BLEND); // Turn blending On + //glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glColor4f (color.getX(), color.getY(), color.getZ(), alpha); + glPushMatrix (); + glTranslatef (center.getX(), center.getY(), center.getZ()); + glScaled(2*halfExtent[0], 2*halfExtent[1], 2*halfExtent[2]); + glutSolidCube(1.0); + glPopMatrix (); + //glDisable(GL_BLEND); +} + void GLDebugDrawer::drawTriangle(const btVector3& a,const btVector3& b,const btVector3& c,const btVector3& color,btScalar alpha) { // if (m_debugMode > 0) diff --git a/Demos/OpenGL/GLDebugDrawer.h b/Demos/OpenGL/GLDebugDrawer.h index b2ad621e7..2a05405a7 100644 --- a/Demos/OpenGL/GLDebugDrawer.h +++ b/Demos/OpenGL/GLDebugDrawer.h @@ -14,8 +14,13 @@ public: GLDebugDrawer(); + virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& fromColor, const btVector3& toColor); + virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color); - + + virtual void drawSphere (const btVector3& p, btScalar radius, const btVector3& color); + virtual void drawBox (const btVector3& boxMin, const btVector3& boxMax, const btVector3& color, btScalar alpha); + virtual void drawTriangle(const btVector3& a,const btVector3& b,const btVector3& c,const btVector3& color,btScalar alpha); virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color); diff --git a/Demos/OpenGL/GL_ShapeDrawer.h b/Demos/OpenGL/GL_ShapeDrawer.h index 30eb7a6ca..6b7b3e222 100644 --- a/Demos/OpenGL/GL_ShapeDrawer.h +++ b/Demos/OpenGL/GL_ShapeDrawer.h @@ -25,6 +25,7 @@ class btShapeHull; /// OpenGL shape drawing class GL_ShapeDrawer { +protected: struct ShapeCache { struct Edge { btVector3 n[2];int v[2]; }; @@ -38,17 +39,17 @@ class GL_ShapeDrawer bool m_textureenabled; bool m_textureinitialized; - private: + ShapeCache* cache(btConvexShape*); - public: +public: GL_ShapeDrawer(); virtual ~GL_ShapeDrawer(); ///drawOpenGL might allocate temporary memoty, stores pointer in shape userpointer - void drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax); - void drawShadow(btScalar* m, const btVector3& extrusion,const btCollisionShape* shape,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax); + virtual void drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax); + virtual void drawShadow(btScalar* m, const btVector3& extrusion,const btCollisionShape* shape,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax); bool enableTexture(bool enable) { bool p=m_textureenabled;m_textureenabled=enable;return(p); } bool hasTextureEnabled() const @@ -64,4 +65,4 @@ class GL_ShapeDrawer void OGL_displaylist_register_shape(btCollisionShape * shape); void OGL_displaylist_clean(); -#endif //GL_SHAPE_DRAWER_H +#endif //GL_SHAPE_DRAWER_H \ No newline at end of file diff --git a/Demos/SimplexDemo/SimplexDemo.cpp b/Demos/SimplexDemo/SimplexDemo.cpp index e9c044a25..f804c73d9 100644 --- a/Demos/SimplexDemo/SimplexDemo.cpp +++ b/Demos/SimplexDemo/SimplexDemo.cpp @@ -91,7 +91,7 @@ void SimplexDemo::displayCallback() transA.getOpenGLMatrix( m ); /// draw the simplex - m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); /// calculate closest point from simplex to the origin, and draw this vector simplex.calcClosest(m); diff --git a/Demos/VehicleDemo/VehicleDemo.cpp b/Demos/VehicleDemo/VehicleDemo.cpp index 86f7444dd..277bcaf6e 100644 --- a/Demos/VehicleDemo/VehicleDemo.cpp +++ b/Demos/VehicleDemo/VehicleDemo.cpp @@ -414,7 +414,7 @@ void VehicleDemo::renderme() m_vehicle->updateWheelTransform(i,true); //draw wheels (cylinders) m_vehicle->getWheelInfo(i).m_worldTransform.getOpenGLMatrix(m); - m_shapeDrawer.drawOpenGL(m,&wheelShape,wheelColor,getDebugMode(),worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL(m,&wheelShape,wheelColor,getDebugMode(),worldBoundsMin,worldBoundsMax); } diff --git a/msvc/8/wksbullet.sln b/msvc/8/wksbullet.sln index 56fb98980..f4fe0a305 100644 --- a/msvc/8/wksbullet.sln +++ b/msvc/8/wksbullet.sln @@ -1,76 +1,403 @@ Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 +# Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appAllBulletDemos", "appAllBulletDemos.vcproj", "{7CE54E12-D3D5-878F-9CC5-786265A3F9CE}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + {C04EA8AC-D96C-0E1F-0823-094C1010F087} = {C04EA8AC-D96C-0E1F-0823-094C1010F087} + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} + {B1B5F775-54A9-2437-E4AC-7E817E492142} = {B1B5F775-54A9-2437-E4AC-7E817E492142} + {81819498-F4A8-E0CA-8ED5-724E27AB34E7} = {81819498-F4A8-E0CA-8ED5-724E27AB34E7} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appBasicDemo", "appBasicDemo.vcproj", "{3578834A-4B06-DE6F-78AC-FE11F7226D35}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appBenchmarks", "appBenchmarks.vcproj", "{67034B5D-16DD-DC97-82F6-23B9E6108940}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appBspDemo", "appBspDemo.vcproj", "{255A379C-F159-5362-4024-D5ADB9F5FBD2}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appBulletDino", "appBulletDino.vcproj", "{2707A1D2-F23C-0C78-B99B-AA148865D6DD}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appCcdPhysicsDemo", "appCcdPhysicsDemo.vcproj", "{7284F809-AF30-6315-88C6-86F1C0798760}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appCharacterDemo", "appCharacterDemo.vcproj", "{06166AA4-DDAE-0CA9-6D52-DA45A1965B88}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appColladaDemo", "appColladaDemo.vcproj", "{D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}" + ProjectSection(ProjectDependencies) = postProject + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E} = {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E} + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + {6AB01C9C-9163-F400-B5C3-20D046631E17} = {6AB01C9C-9163-F400-B5C3-20D046631E17} + {A0958CD9-0E39-4A77-3711-9B488F508FBF} = {A0958CD9-0E39-4A77-3711-9B488F508FBF} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appCollisionDemo", "appCollisionDemo.vcproj", "{E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appCollisionInterfaceDemo", "appCollisionInterfaceDemo.vcproj", "{F38629D2-EEB2-1A09-FB82-52B8A8DE759B}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appConcaveDemo", "appConcaveDemo.vcproj", "{B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appConstraintDemo", "appConstraintDemo.vcproj", "{DAA547D0-0166-C085-0F93-B88CAB800F97}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appContinuousConvexCollision", "appContinuousConvexCollision.vcproj", "{801CB6D4-A45C-C9D2-B176-9711A74B9164}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appConvexDecompositionDemo", "appConvexDecompositionDemo.vcproj", "{69C821C7-1E18-D894-068D-C55E063F4859}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appDoublePrecisionDemo", "appDoublePrecisionDemo.vcproj", "{E2707D44-8B82-55F1-6C5A-D03B19159248}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appEPAPenDepthDemo", "appEPAPenDepthDemo.vcproj", "{1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appForkLiftDemo", "appForkLiftDemo.vcproj", "{4FF98546-7A0D-00AA-743C-F1EA15BC00E2}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appGenericJointDemo", "appGenericJointDemo.vcproj", "{33C16464-831E-103A-5F37-65CCD4F9191F}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appGimpactTestDemo", "appGimpactTestDemo.vcproj", "{12B291F0-1880-AFC5-26E1-26DF78EA6D2E}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} + {B1B5F775-54A9-2437-E4AC-7E817E492142} = {B1B5F775-54A9-2437-E4AC-7E817E492142} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appGjkConvexCastDemo", "appGjkConvexCastDemo.vcproj", "{780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appHelloWorld", "appHelloWorld.vcproj", "{5239CE6A-7C7A-2170-6334-DF8EE0C44543}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appiffCheck", "appiffCheck.vcproj", "{D423BB79-A5EE-4742-956D-69482488AF7C}" + ProjectSection(ProjectDependencies) = postProject + {0E48992F-80FB-7458-8BAF-A7054C73558F} = {0E48992F-80FB-7458-8BAF-A7054C73558F} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appMovingConcaveDemo", "appMovingConcaveDemo.vcproj", "{2D714360-B8EC-F8E0-ED74-E95336301075}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appMultiMaterialDemo", "appMultiMaterialDemo.vcproj", "{7C050627-6267-11A1-E342-374FA0095116}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appMultiThreadedDemo", "appMultiThreadedDemo.vcproj", "{6D016A7B-39C8-2018-733F-22921BE94AC4}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appRagdollDemo", "appRagdollDemo.vcproj", "{EFEF2072-51F9-DAE8-AC38-3E653C680F74}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appRaytracer", "appRaytracer.vcproj", "{60F71B6A-F888-C449-EF49-268BB9F7C963}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appSimplexDemo", "appSimplexDemo.vcproj", "{60A1DC9D-F837-3923-E9DE-A7925394A578}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appSliderConstraintDemo", "appSliderConstraintDemo.vcproj", "{E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appSoftBodyDemo", "appSoftBodyDemo.vcproj", "{106E3D23-110E-5DD8-4A6A-D8A2250C43C9}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + {C04EA8AC-D96C-0E1F-0823-094C1010F087} = {C04EA8AC-D96C-0E1F-0823-094C1010F087} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appTerrainDemo", "appTerrainDemo.vcproj", "{7FE87C67-4B29-D636-0AEC-BFFCE47A2164}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appUserCollisionAlgorithm", "appUserCollisionAlgorithm.vcproj", "{330B5049-6935-5CE6-79B7-28F570962895}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appVehicleDemo", "appVehicleDemo.vcproj", "{07E712DB-DAF8-887E-F099-CE43D4E8B1F9}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grpall_bullet", "grpall_bullet.vcproj", "{6210A080-01C0-6D67-F1DB-669393175402}" + ProjectSection(ProjectDependencies) = postProject + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE} = {7CE54E12-D3D5-878F-9CC5-786265A3F9CE} + {3578834A-4B06-DE6F-78AC-FE11F7226D35} = {3578834A-4B06-DE6F-78AC-FE11F7226D35} + {67034B5D-16DD-DC97-82F6-23B9E6108940} = {67034B5D-16DD-DC97-82F6-23B9E6108940} + {255A379C-F159-5362-4024-D5ADB9F5FBD2} = {255A379C-F159-5362-4024-D5ADB9F5FBD2} + {2707A1D2-F23C-0C78-B99B-AA148865D6DD} = {2707A1D2-F23C-0C78-B99B-AA148865D6DD} + {7284F809-AF30-6315-88C6-86F1C0798760} = {7284F809-AF30-6315-88C6-86F1C0798760} + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88} = {06166AA4-DDAE-0CA9-6D52-DA45A1965B88} + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF} = {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF} + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9} = {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9} + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B} = {F38629D2-EEB2-1A09-FB82-52B8A8DE759B} + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3} = {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3} + {DAA547D0-0166-C085-0F93-B88CAB800F97} = {DAA547D0-0166-C085-0F93-B88CAB800F97} + {801CB6D4-A45C-C9D2-B176-9711A74B9164} = {801CB6D4-A45C-C9D2-B176-9711A74B9164} + {69C821C7-1E18-D894-068D-C55E063F4859} = {69C821C7-1E18-D894-068D-C55E063F4859} + {E2707D44-8B82-55F1-6C5A-D03B19159248} = {E2707D44-8B82-55F1-6C5A-D03B19159248} + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3} = {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3} + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2} = {4FF98546-7A0D-00AA-743C-F1EA15BC00E2} + {33C16464-831E-103A-5F37-65CCD4F9191F} = {33C16464-831E-103A-5F37-65CCD4F9191F} + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E} = {12B291F0-1880-AFC5-26E1-26DF78EA6D2E} + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1} = {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1} + {5239CE6A-7C7A-2170-6334-DF8EE0C44543} = {5239CE6A-7C7A-2170-6334-DF8EE0C44543} + {D423BB79-A5EE-4742-956D-69482488AF7C} = {D423BB79-A5EE-4742-956D-69482488AF7C} + {2D714360-B8EC-F8E0-ED74-E95336301075} = {2D714360-B8EC-F8E0-ED74-E95336301075} + {7C050627-6267-11A1-E342-374FA0095116} = {7C050627-6267-11A1-E342-374FA0095116} + {6D016A7B-39C8-2018-733F-22921BE94AC4} = {6D016A7B-39C8-2018-733F-22921BE94AC4} + {EFEF2072-51F9-DAE8-AC38-3E653C680F74} = {EFEF2072-51F9-DAE8-AC38-3E653C680F74} + {60F71B6A-F888-C449-EF49-268BB9F7C963} = {60F71B6A-F888-C449-EF49-268BB9F7C963} + {60A1DC9D-F837-3923-E9DE-A7925394A578} = {60A1DC9D-F837-3923-E9DE-A7925394A578} + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE} = {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE} + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9} = {106E3D23-110E-5DD8-4A6A-D8A2250C43C9} + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164} = {7FE87C67-4B29-D636-0AEC-BFFCE47A2164} + {330B5049-6935-5CE6-79B7-28F570962895} = {330B5049-6935-5CE6-79B7-28F570962895} + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9} = {07E712DB-DAF8-887E-F099-CE43D4E8B1F9} + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E} = {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E} + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + {C04EA8AC-D96C-0E1F-0823-094C1010F087} = {C04EA8AC-D96C-0E1F-0823-094C1010F087} + {6AB01C9C-9163-F400-B5C3-20D046631E17} = {6AB01C9C-9163-F400-B5C3-20D046631E17} + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} + {B1B5F775-54A9-2437-E4AC-7E817E492142} = {B1B5F775-54A9-2437-E4AC-7E817E492142} + {81819498-F4A8-E0CA-8ED5-724E27AB34E7} = {81819498-F4A8-E0CA-8ED5-724E27AB34E7} + {0E48992F-80FB-7458-8BAF-A7054C73558F} = {0E48992F-80FB-7458-8BAF-A7054C73558F} + {A0958CD9-0E39-4A77-3711-9B488F508FBF} = {A0958CD9-0E39-4A77-3711-9B488F508FBF} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grpapps_bullet", "grpapps_bullet.vcproj", "{9E59B16D-0924-409C-1611-DF2207A0053F}" + ProjectSection(ProjectDependencies) = postProject + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE} = {7CE54E12-D3D5-878F-9CC5-786265A3F9CE} + {3578834A-4B06-DE6F-78AC-FE11F7226D35} = {3578834A-4B06-DE6F-78AC-FE11F7226D35} + {67034B5D-16DD-DC97-82F6-23B9E6108940} = {67034B5D-16DD-DC97-82F6-23B9E6108940} + {255A379C-F159-5362-4024-D5ADB9F5FBD2} = {255A379C-F159-5362-4024-D5ADB9F5FBD2} + {2707A1D2-F23C-0C78-B99B-AA148865D6DD} = {2707A1D2-F23C-0C78-B99B-AA148865D6DD} + {7284F809-AF30-6315-88C6-86F1C0798760} = {7284F809-AF30-6315-88C6-86F1C0798760} + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88} = {06166AA4-DDAE-0CA9-6D52-DA45A1965B88} + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF} = {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF} + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9} = {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9} + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B} = {F38629D2-EEB2-1A09-FB82-52B8A8DE759B} + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3} = {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3} + {DAA547D0-0166-C085-0F93-B88CAB800F97} = {DAA547D0-0166-C085-0F93-B88CAB800F97} + {801CB6D4-A45C-C9D2-B176-9711A74B9164} = {801CB6D4-A45C-C9D2-B176-9711A74B9164} + {69C821C7-1E18-D894-068D-C55E063F4859} = {69C821C7-1E18-D894-068D-C55E063F4859} + {E2707D44-8B82-55F1-6C5A-D03B19159248} = {E2707D44-8B82-55F1-6C5A-D03B19159248} + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3} = {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3} + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2} = {4FF98546-7A0D-00AA-743C-F1EA15BC00E2} + {33C16464-831E-103A-5F37-65CCD4F9191F} = {33C16464-831E-103A-5F37-65CCD4F9191F} + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E} = {12B291F0-1880-AFC5-26E1-26DF78EA6D2E} + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1} = {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1} + {5239CE6A-7C7A-2170-6334-DF8EE0C44543} = {5239CE6A-7C7A-2170-6334-DF8EE0C44543} + {D423BB79-A5EE-4742-956D-69482488AF7C} = {D423BB79-A5EE-4742-956D-69482488AF7C} + {2D714360-B8EC-F8E0-ED74-E95336301075} = {2D714360-B8EC-F8E0-ED74-E95336301075} + {7C050627-6267-11A1-E342-374FA0095116} = {7C050627-6267-11A1-E342-374FA0095116} + {6D016A7B-39C8-2018-733F-22921BE94AC4} = {6D016A7B-39C8-2018-733F-22921BE94AC4} + {EFEF2072-51F9-DAE8-AC38-3E653C680F74} = {EFEF2072-51F9-DAE8-AC38-3E653C680F74} + {60F71B6A-F888-C449-EF49-268BB9F7C963} = {60F71B6A-F888-C449-EF49-268BB9F7C963} + {60A1DC9D-F837-3923-E9DE-A7925394A578} = {60A1DC9D-F837-3923-E9DE-A7925394A578} + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE} = {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE} + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9} = {106E3D23-110E-5DD8-4A6A-D8A2250C43C9} + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164} = {7FE87C67-4B29-D636-0AEC-BFFCE47A2164} + {330B5049-6935-5CE6-79B7-28F570962895} = {330B5049-6935-5CE6-79B7-28F570962895} + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9} = {07E712DB-DAF8-887E-F099-CE43D4E8B1F9} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grplibs_bullet", "grplibs_bullet.vcproj", "{DFAF0062-4CD7-9AB8-0683-A6026B326F56}" + ProjectSection(ProjectDependencies) = postProject + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E} = {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E} + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + {C04EA8AC-D96C-0E1F-0823-094C1010F087} = {C04EA8AC-D96C-0E1F-0823-094C1010F087} + {6AB01C9C-9163-F400-B5C3-20D046631E17} = {6AB01C9C-9163-F400-B5C3-20D046631E17} + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} + {B1B5F775-54A9-2437-E4AC-7E817E492142} = {B1B5F775-54A9-2437-E4AC-7E817E492142} + {81819498-F4A8-E0CA-8ED5-724E27AB34E7} = {81819498-F4A8-E0CA-8ED5-724E27AB34E7} + {0E48992F-80FB-7458-8BAF-A7054C73558F} = {0E48992F-80FB-7458-8BAF-A7054C73558F} + {A0958CD9-0E39-4A77-3711-9B488F508FBF} = {A0958CD9-0E39-4A77-3711-9B488F508FBF} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libBulletColladaConverter", "libBulletColladaConverter.vcproj", "{ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}" EndProject @@ -98,864 +425,626 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libiff", "libiff.vcproj", " EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblibxml", "liblibxml.vcproj", "{A0958CD9-0E39-4A77-3711-9B488F508FBF}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appHeightFieldFluidDemo", "appHeightFieldFluidDemo.vcproj", "{6611E163-4570-42F7-B746-F0176D26E080}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + EndProjectSection +EndProject Global - GlobalSection(SolutionConfiguration) = preSolution - ConfigName.0 = Release - ConfigName.1 = ReleaseDll - ConfigName.2 = ReleaseDoublePrecision - ConfigName.3 = Debug - ConfigName.4 = DebugDll - ConfigName.5 = DebugDoublePrecision + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + DebugDll|Win32 = DebugDll|Win32 + DebugDoublePrecision|Win32 = DebugDoublePrecision|Win32 + Release|Win32 = Release|Win32 + ReleaseDll|Win32 = ReleaseDll|Win32 + ReleaseDoublePrecision|Win32 = ReleaseDoublePrecision|Win32 EndGlobalSection - GlobalSection(ProjectDependencies) = postSolution - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.3 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.4 = {C04EA8AC-D96C-0E1F-0823-094C1010F087} - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.5 = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.6 = {B1B5F775-54A9-2437-E4AC-7E817E492142} - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.7 = {81819498-F4A8-E0CA-8ED5-724E27AB34E7} - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {67034B5D-16DD-DC97-82F6-23B9E6108940}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {67034B5D-16DD-DC97-82F6-23B9E6108940}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {67034B5D-16DD-DC97-82F6-23B9E6108940}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {67034B5D-16DD-DC97-82F6-23B9E6108940}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {67034B5D-16DD-DC97-82F6-23B9E6108940}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {7284F809-AF30-6315-88C6-86F1C0798760}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {7284F809-AF30-6315-88C6-86F1C0798760}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {7284F809-AF30-6315-88C6-86F1C0798760}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {7284F809-AF30-6315-88C6-86F1C0798760}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {7284F809-AF30-6315-88C6-86F1C0798760}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.0 = {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E} - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.1 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.5 = {6AB01C9C-9163-F400-B5C3-20D046631E17} - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.6 = {A0958CD9-0E39-4A77-3711-9B488F508FBF} - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {DAA547D0-0166-C085-0F93-B88CAB800F97}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {DAA547D0-0166-C085-0F93-B88CAB800F97}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {DAA547D0-0166-C085-0F93-B88CAB800F97}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {DAA547D0-0166-C085-0F93-B88CAB800F97}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {DAA547D0-0166-C085-0F93-B88CAB800F97}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {69C821C7-1E18-D894-068D-C55E063F4859}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {69C821C7-1E18-D894-068D-C55E063F4859}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {69C821C7-1E18-D894-068D-C55E063F4859}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {69C821C7-1E18-D894-068D-C55E063F4859}.3 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {69C821C7-1E18-D894-068D-C55E063F4859}.4 = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} - {E2707D44-8B82-55F1-6C5A-D03B19159248}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {E2707D44-8B82-55F1-6C5A-D03B19159248}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {E2707D44-8B82-55F1-6C5A-D03B19159248}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {E2707D44-8B82-55F1-6C5A-D03B19159248}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {E2707D44-8B82-55F1-6C5A-D03B19159248}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.3 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {33C16464-831E-103A-5F37-65CCD4F9191F}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {33C16464-831E-103A-5F37-65CCD4F9191F}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {33C16464-831E-103A-5F37-65CCD4F9191F}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {33C16464-831E-103A-5F37-65CCD4F9191F}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {33C16464-831E-103A-5F37-65CCD4F9191F}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.3 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.4 = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.5 = {B1B5F775-54A9-2437-E4AC-7E817E492142} - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {D423BB79-A5EE-4742-956D-69482488AF7C}.0 = {0E48992F-80FB-7458-8BAF-A7054C73558F} - {2D714360-B8EC-F8E0-ED74-E95336301075}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {2D714360-B8EC-F8E0-ED74-E95336301075}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {2D714360-B8EC-F8E0-ED74-E95336301075}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {2D714360-B8EC-F8E0-ED74-E95336301075}.3 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {7C050627-6267-11A1-E342-374FA0095116}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {7C050627-6267-11A1-E342-374FA0095116}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {7C050627-6267-11A1-E342-374FA0095116}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {7C050627-6267-11A1-E342-374FA0095116}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {7C050627-6267-11A1-E342-374FA0095116}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {6D016A7B-39C8-2018-733F-22921BE94AC4}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {6D016A7B-39C8-2018-733F-22921BE94AC4}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {6D016A7B-39C8-2018-733F-22921BE94AC4}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {6D016A7B-39C8-2018-733F-22921BE94AC4}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {6D016A7B-39C8-2018-733F-22921BE94AC4}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {60F71B6A-F888-C449-EF49-268BB9F7C963}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {60F71B6A-F888-C449-EF49-268BB9F7C963}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {60F71B6A-F888-C449-EF49-268BB9F7C963}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {60F71B6A-F888-C449-EF49-268BB9F7C963}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {60F71B6A-F888-C449-EF49-268BB9F7C963}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {60A1DC9D-F837-3923-E9DE-A7925394A578}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {60A1DC9D-F837-3923-E9DE-A7925394A578}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {60A1DC9D-F837-3923-E9DE-A7925394A578}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {60A1DC9D-F837-3923-E9DE-A7925394A578}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {60A1DC9D-F837-3923-E9DE-A7925394A578}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.3 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.4 = {C04EA8AC-D96C-0E1F-0823-094C1010F087} - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {330B5049-6935-5CE6-79B7-28F570962895}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {330B5049-6935-5CE6-79B7-28F570962895}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {330B5049-6935-5CE6-79B7-28F570962895}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {330B5049-6935-5CE6-79B7-28F570962895}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {330B5049-6935-5CE6-79B7-28F570962895}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.0 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.1 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.2 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.3 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.4 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {6210A080-01C0-6D67-F1DB-669393175402}.0 = {7CE54E12-D3D5-878F-9CC5-786265A3F9CE} - {6210A080-01C0-6D67-F1DB-669393175402}.1 = {3578834A-4B06-DE6F-78AC-FE11F7226D35} - {6210A080-01C0-6D67-F1DB-669393175402}.2 = {67034B5D-16DD-DC97-82F6-23B9E6108940} - {6210A080-01C0-6D67-F1DB-669393175402}.3 = {255A379C-F159-5362-4024-D5ADB9F5FBD2} - {6210A080-01C0-6D67-F1DB-669393175402}.4 = {2707A1D2-F23C-0C78-B99B-AA148865D6DD} - {6210A080-01C0-6D67-F1DB-669393175402}.5 = {7284F809-AF30-6315-88C6-86F1C0798760} - {6210A080-01C0-6D67-F1DB-669393175402}.6 = {06166AA4-DDAE-0CA9-6D52-DA45A1965B88} - {6210A080-01C0-6D67-F1DB-669393175402}.7 = {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF} - {6210A080-01C0-6D67-F1DB-669393175402}.8 = {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9} - {6210A080-01C0-6D67-F1DB-669393175402}.9 = {F38629D2-EEB2-1A09-FB82-52B8A8DE759B} - {6210A080-01C0-6D67-F1DB-669393175402}.10 = {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3} - {6210A080-01C0-6D67-F1DB-669393175402}.11 = {DAA547D0-0166-C085-0F93-B88CAB800F97} - {6210A080-01C0-6D67-F1DB-669393175402}.12 = {801CB6D4-A45C-C9D2-B176-9711A74B9164} - {6210A080-01C0-6D67-F1DB-669393175402}.13 = {69C821C7-1E18-D894-068D-C55E063F4859} - {6210A080-01C0-6D67-F1DB-669393175402}.14 = {E2707D44-8B82-55F1-6C5A-D03B19159248} - {6210A080-01C0-6D67-F1DB-669393175402}.15 = {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3} - {6210A080-01C0-6D67-F1DB-669393175402}.16 = {4FF98546-7A0D-00AA-743C-F1EA15BC00E2} - {6210A080-01C0-6D67-F1DB-669393175402}.17 = {33C16464-831E-103A-5F37-65CCD4F9191F} - {6210A080-01C0-6D67-F1DB-669393175402}.18 = {12B291F0-1880-AFC5-26E1-26DF78EA6D2E} - {6210A080-01C0-6D67-F1DB-669393175402}.19 = {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1} - {6210A080-01C0-6D67-F1DB-669393175402}.20 = {5239CE6A-7C7A-2170-6334-DF8EE0C44543} - {6210A080-01C0-6D67-F1DB-669393175402}.21 = {D423BB79-A5EE-4742-956D-69482488AF7C} - {6210A080-01C0-6D67-F1DB-669393175402}.22 = {2D714360-B8EC-F8E0-ED74-E95336301075} - {6210A080-01C0-6D67-F1DB-669393175402}.23 = {7C050627-6267-11A1-E342-374FA0095116} - {6210A080-01C0-6D67-F1DB-669393175402}.24 = {6D016A7B-39C8-2018-733F-22921BE94AC4} - {6210A080-01C0-6D67-F1DB-669393175402}.25 = {EFEF2072-51F9-DAE8-AC38-3E653C680F74} - {6210A080-01C0-6D67-F1DB-669393175402}.26 = {60F71B6A-F888-C449-EF49-268BB9F7C963} - {6210A080-01C0-6D67-F1DB-669393175402}.27 = {60A1DC9D-F837-3923-E9DE-A7925394A578} - {6210A080-01C0-6D67-F1DB-669393175402}.28 = {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE} - {6210A080-01C0-6D67-F1DB-669393175402}.29 = {106E3D23-110E-5DD8-4A6A-D8A2250C43C9} - {6210A080-01C0-6D67-F1DB-669393175402}.30 = {7FE87C67-4B29-D636-0AEC-BFFCE47A2164} - {6210A080-01C0-6D67-F1DB-669393175402}.31 = {330B5049-6935-5CE6-79B7-28F570962895} - {6210A080-01C0-6D67-F1DB-669393175402}.32 = {07E712DB-DAF8-887E-F099-CE43D4E8B1F9} - {6210A080-01C0-6D67-F1DB-669393175402}.33 = {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E} - {6210A080-01C0-6D67-F1DB-669393175402}.34 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {6210A080-01C0-6D67-F1DB-669393175402}.35 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {6210A080-01C0-6D67-F1DB-669393175402}.36 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {6210A080-01C0-6D67-F1DB-669393175402}.37 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {6210A080-01C0-6D67-F1DB-669393175402}.38 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {6210A080-01C0-6D67-F1DB-669393175402}.39 = {C04EA8AC-D96C-0E1F-0823-094C1010F087} - {6210A080-01C0-6D67-F1DB-669393175402}.40 = {6AB01C9C-9163-F400-B5C3-20D046631E17} - {6210A080-01C0-6D67-F1DB-669393175402}.41 = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} - {6210A080-01C0-6D67-F1DB-669393175402}.42 = {B1B5F775-54A9-2437-E4AC-7E817E492142} - {6210A080-01C0-6D67-F1DB-669393175402}.43 = {81819498-F4A8-E0CA-8ED5-724E27AB34E7} - {6210A080-01C0-6D67-F1DB-669393175402}.44 = {0E48992F-80FB-7458-8BAF-A7054C73558F} - {6210A080-01C0-6D67-F1DB-669393175402}.45 = {A0958CD9-0E39-4A77-3711-9B488F508FBF} - {9E59B16D-0924-409C-1611-DF2207A0053F}.0 = {7CE54E12-D3D5-878F-9CC5-786265A3F9CE} - {9E59B16D-0924-409C-1611-DF2207A0053F}.1 = {3578834A-4B06-DE6F-78AC-FE11F7226D35} - {9E59B16D-0924-409C-1611-DF2207A0053F}.2 = {67034B5D-16DD-DC97-82F6-23B9E6108940} - {9E59B16D-0924-409C-1611-DF2207A0053F}.3 = {255A379C-F159-5362-4024-D5ADB9F5FBD2} - {9E59B16D-0924-409C-1611-DF2207A0053F}.4 = {2707A1D2-F23C-0C78-B99B-AA148865D6DD} - {9E59B16D-0924-409C-1611-DF2207A0053F}.5 = {7284F809-AF30-6315-88C6-86F1C0798760} - {9E59B16D-0924-409C-1611-DF2207A0053F}.6 = {06166AA4-DDAE-0CA9-6D52-DA45A1965B88} - {9E59B16D-0924-409C-1611-DF2207A0053F}.7 = {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF} - {9E59B16D-0924-409C-1611-DF2207A0053F}.8 = {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9} - {9E59B16D-0924-409C-1611-DF2207A0053F}.9 = {F38629D2-EEB2-1A09-FB82-52B8A8DE759B} - {9E59B16D-0924-409C-1611-DF2207A0053F}.10 = {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3} - {9E59B16D-0924-409C-1611-DF2207A0053F}.11 = {DAA547D0-0166-C085-0F93-B88CAB800F97} - {9E59B16D-0924-409C-1611-DF2207A0053F}.12 = {801CB6D4-A45C-C9D2-B176-9711A74B9164} - {9E59B16D-0924-409C-1611-DF2207A0053F}.13 = {69C821C7-1E18-D894-068D-C55E063F4859} - {9E59B16D-0924-409C-1611-DF2207A0053F}.14 = {E2707D44-8B82-55F1-6C5A-D03B19159248} - {9E59B16D-0924-409C-1611-DF2207A0053F}.15 = {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3} - {9E59B16D-0924-409C-1611-DF2207A0053F}.16 = {4FF98546-7A0D-00AA-743C-F1EA15BC00E2} - {9E59B16D-0924-409C-1611-DF2207A0053F}.17 = {33C16464-831E-103A-5F37-65CCD4F9191F} - {9E59B16D-0924-409C-1611-DF2207A0053F}.18 = {12B291F0-1880-AFC5-26E1-26DF78EA6D2E} - {9E59B16D-0924-409C-1611-DF2207A0053F}.19 = {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1} - {9E59B16D-0924-409C-1611-DF2207A0053F}.20 = {5239CE6A-7C7A-2170-6334-DF8EE0C44543} - {9E59B16D-0924-409C-1611-DF2207A0053F}.21 = {D423BB79-A5EE-4742-956D-69482488AF7C} - {9E59B16D-0924-409C-1611-DF2207A0053F}.22 = {2D714360-B8EC-F8E0-ED74-E95336301075} - {9E59B16D-0924-409C-1611-DF2207A0053F}.23 = {7C050627-6267-11A1-E342-374FA0095116} - {9E59B16D-0924-409C-1611-DF2207A0053F}.24 = {6D016A7B-39C8-2018-733F-22921BE94AC4} - {9E59B16D-0924-409C-1611-DF2207A0053F}.25 = {EFEF2072-51F9-DAE8-AC38-3E653C680F74} - {9E59B16D-0924-409C-1611-DF2207A0053F}.26 = {60F71B6A-F888-C449-EF49-268BB9F7C963} - {9E59B16D-0924-409C-1611-DF2207A0053F}.27 = {60A1DC9D-F837-3923-E9DE-A7925394A578} - {9E59B16D-0924-409C-1611-DF2207A0053F}.28 = {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE} - {9E59B16D-0924-409C-1611-DF2207A0053F}.29 = {106E3D23-110E-5DD8-4A6A-D8A2250C43C9} - {9E59B16D-0924-409C-1611-DF2207A0053F}.30 = {7FE87C67-4B29-D636-0AEC-BFFCE47A2164} - {9E59B16D-0924-409C-1611-DF2207A0053F}.31 = {330B5049-6935-5CE6-79B7-28F570962895} - {9E59B16D-0924-409C-1611-DF2207A0053F}.32 = {07E712DB-DAF8-887E-F099-CE43D4E8B1F9} - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.0 = {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E} - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.1 = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.2 = {61BD1097-CF2E-B296-DAA9-73A6FE135319} - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.3 = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.4 = {A24D77FD-D69A-75A0-A7DC-730894C9D0F7} - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.5 = {7C428E76-9271-6284-20F0-9B38ED6931E3} - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.6 = {C04EA8AC-D96C-0E1F-0823-094C1010F087} - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.7 = {6AB01C9C-9163-F400-B5C3-20D046631E17} - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.8 = {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3} - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.9 = {B1B5F775-54A9-2437-E4AC-7E817E492142} - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.10 = {81819498-F4A8-E0CA-8ED5-724E27AB34E7} - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.11 = {0E48992F-80FB-7458-8BAF-A7054C73558F} - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.12 = {A0958CD9-0E39-4A77-3711-9B488F508FBF} + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.Debug|Win32.ActiveCfg = Debug|Win32 + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.Debug|Win32.Build.0 = Debug|Win32 + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.Release|Win32.ActiveCfg = Release|Win32 + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.Release|Win32.Build.0 = Release|Win32 + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Debug|Win32.ActiveCfg = Debug|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Debug|Win32.Build.0 = Debug|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Release|Win32.ActiveCfg = Release|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Release|Win32.Build.0 = Release|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {67034B5D-16DD-DC97-82F6-23B9E6108940}.Debug|Win32.ActiveCfg = Debug|Win32 + {67034B5D-16DD-DC97-82F6-23B9E6108940}.Debug|Win32.Build.0 = Debug|Win32 + {67034B5D-16DD-DC97-82F6-23B9E6108940}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {67034B5D-16DD-DC97-82F6-23B9E6108940}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {67034B5D-16DD-DC97-82F6-23B9E6108940}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {67034B5D-16DD-DC97-82F6-23B9E6108940}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {67034B5D-16DD-DC97-82F6-23B9E6108940}.Release|Win32.ActiveCfg = Release|Win32 + {67034B5D-16DD-DC97-82F6-23B9E6108940}.Release|Win32.Build.0 = Release|Win32 + {67034B5D-16DD-DC97-82F6-23B9E6108940}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {67034B5D-16DD-DC97-82F6-23B9E6108940}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {67034B5D-16DD-DC97-82F6-23B9E6108940}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {67034B5D-16DD-DC97-82F6-23B9E6108940}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {255A379C-F159-5362-4024-D5ADB9F5FBD2}.Debug|Win32.ActiveCfg = Debug|Win32 + {255A379C-F159-5362-4024-D5ADB9F5FBD2}.Debug|Win32.Build.0 = Debug|Win32 + {255A379C-F159-5362-4024-D5ADB9F5FBD2}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {255A379C-F159-5362-4024-D5ADB9F5FBD2}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {255A379C-F159-5362-4024-D5ADB9F5FBD2}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {255A379C-F159-5362-4024-D5ADB9F5FBD2}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {255A379C-F159-5362-4024-D5ADB9F5FBD2}.Release|Win32.ActiveCfg = Release|Win32 + {255A379C-F159-5362-4024-D5ADB9F5FBD2}.Release|Win32.Build.0 = Release|Win32 + {255A379C-F159-5362-4024-D5ADB9F5FBD2}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {255A379C-F159-5362-4024-D5ADB9F5FBD2}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {255A379C-F159-5362-4024-D5ADB9F5FBD2}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {255A379C-F159-5362-4024-D5ADB9F5FBD2}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.Debug|Win32.ActiveCfg = Debug|Win32 + {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.Debug|Win32.Build.0 = Debug|Win32 + {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.Release|Win32.ActiveCfg = Release|Win32 + {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.Release|Win32.Build.0 = Release|Win32 + {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {7284F809-AF30-6315-88C6-86F1C0798760}.Debug|Win32.ActiveCfg = Debug|Win32 + {7284F809-AF30-6315-88C6-86F1C0798760}.Debug|Win32.Build.0 = Debug|Win32 + {7284F809-AF30-6315-88C6-86F1C0798760}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {7284F809-AF30-6315-88C6-86F1C0798760}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {7284F809-AF30-6315-88C6-86F1C0798760}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {7284F809-AF30-6315-88C6-86F1C0798760}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {7284F809-AF30-6315-88C6-86F1C0798760}.Release|Win32.ActiveCfg = Release|Win32 + {7284F809-AF30-6315-88C6-86F1C0798760}.Release|Win32.Build.0 = Release|Win32 + {7284F809-AF30-6315-88C6-86F1C0798760}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {7284F809-AF30-6315-88C6-86F1C0798760}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {7284F809-AF30-6315-88C6-86F1C0798760}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {7284F809-AF30-6315-88C6-86F1C0798760}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.Debug|Win32.ActiveCfg = Debug|Win32 + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.Debug|Win32.Build.0 = Debug|Win32 + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.Release|Win32.ActiveCfg = Release|Win32 + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.Release|Win32.Build.0 = Release|Win32 + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Debug|Win32.ActiveCfg = Debug|Win32 + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Debug|Win32.Build.0 = Debug|Win32 + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Release|Win32.ActiveCfg = Release|Win32 + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Release|Win32.Build.0 = Release|Win32 + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Debug|Win32.ActiveCfg = Debug|Win32 + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Debug|Win32.Build.0 = Debug|Win32 + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Release|Win32.ActiveCfg = Release|Win32 + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Release|Win32.Build.0 = Release|Win32 + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Debug|Win32.ActiveCfg = Debug|Win32 + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Debug|Win32.Build.0 = Debug|Win32 + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Release|Win32.ActiveCfg = Release|Win32 + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Release|Win32.Build.0 = Release|Win32 + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Debug|Win32.ActiveCfg = Debug|Win32 + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Debug|Win32.Build.0 = Debug|Win32 + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Release|Win32.ActiveCfg = Release|Win32 + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Release|Win32.Build.0 = Release|Win32 + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {DAA547D0-0166-C085-0F93-B88CAB800F97}.Debug|Win32.ActiveCfg = Debug|Win32 + {DAA547D0-0166-C085-0F93-B88CAB800F97}.Debug|Win32.Build.0 = Debug|Win32 + {DAA547D0-0166-C085-0F93-B88CAB800F97}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {DAA547D0-0166-C085-0F93-B88CAB800F97}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {DAA547D0-0166-C085-0F93-B88CAB800F97}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {DAA547D0-0166-C085-0F93-B88CAB800F97}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {DAA547D0-0166-C085-0F93-B88CAB800F97}.Release|Win32.ActiveCfg = Release|Win32 + {DAA547D0-0166-C085-0F93-B88CAB800F97}.Release|Win32.Build.0 = Release|Win32 + {DAA547D0-0166-C085-0F93-B88CAB800F97}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {DAA547D0-0166-C085-0F93-B88CAB800F97}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {DAA547D0-0166-C085-0F93-B88CAB800F97}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {DAA547D0-0166-C085-0F93-B88CAB800F97}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {801CB6D4-A45C-C9D2-B176-9711A74B9164}.Debug|Win32.ActiveCfg = Debug|Win32 + {801CB6D4-A45C-C9D2-B176-9711A74B9164}.Debug|Win32.Build.0 = Debug|Win32 + {801CB6D4-A45C-C9D2-B176-9711A74B9164}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {801CB6D4-A45C-C9D2-B176-9711A74B9164}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {801CB6D4-A45C-C9D2-B176-9711A74B9164}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {801CB6D4-A45C-C9D2-B176-9711A74B9164}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {801CB6D4-A45C-C9D2-B176-9711A74B9164}.Release|Win32.ActiveCfg = Release|Win32 + {801CB6D4-A45C-C9D2-B176-9711A74B9164}.Release|Win32.Build.0 = Release|Win32 + {801CB6D4-A45C-C9D2-B176-9711A74B9164}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {801CB6D4-A45C-C9D2-B176-9711A74B9164}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {801CB6D4-A45C-C9D2-B176-9711A74B9164}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {801CB6D4-A45C-C9D2-B176-9711A74B9164}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {69C821C7-1E18-D894-068D-C55E063F4859}.Debug|Win32.ActiveCfg = Debug|Win32 + {69C821C7-1E18-D894-068D-C55E063F4859}.Debug|Win32.Build.0 = Debug|Win32 + {69C821C7-1E18-D894-068D-C55E063F4859}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {69C821C7-1E18-D894-068D-C55E063F4859}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {69C821C7-1E18-D894-068D-C55E063F4859}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {69C821C7-1E18-D894-068D-C55E063F4859}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {69C821C7-1E18-D894-068D-C55E063F4859}.Release|Win32.ActiveCfg = Release|Win32 + {69C821C7-1E18-D894-068D-C55E063F4859}.Release|Win32.Build.0 = Release|Win32 + {69C821C7-1E18-D894-068D-C55E063F4859}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {69C821C7-1E18-D894-068D-C55E063F4859}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {69C821C7-1E18-D894-068D-C55E063F4859}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {69C821C7-1E18-D894-068D-C55E063F4859}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {E2707D44-8B82-55F1-6C5A-D03B19159248}.Debug|Win32.ActiveCfg = Debug|Win32 + {E2707D44-8B82-55F1-6C5A-D03B19159248}.Debug|Win32.Build.0 = Debug|Win32 + {E2707D44-8B82-55F1-6C5A-D03B19159248}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {E2707D44-8B82-55F1-6C5A-D03B19159248}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {E2707D44-8B82-55F1-6C5A-D03B19159248}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {E2707D44-8B82-55F1-6C5A-D03B19159248}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {E2707D44-8B82-55F1-6C5A-D03B19159248}.Release|Win32.ActiveCfg = Release|Win32 + {E2707D44-8B82-55F1-6C5A-D03B19159248}.Release|Win32.Build.0 = Release|Win32 + {E2707D44-8B82-55F1-6C5A-D03B19159248}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {E2707D44-8B82-55F1-6C5A-D03B19159248}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {E2707D44-8B82-55F1-6C5A-D03B19159248}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {E2707D44-8B82-55F1-6C5A-D03B19159248}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.Debug|Win32.ActiveCfg = Debug|Win32 + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.Debug|Win32.Build.0 = Debug|Win32 + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.Release|Win32.ActiveCfg = Release|Win32 + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.Release|Win32.Build.0 = Release|Win32 + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.Debug|Win32.ActiveCfg = Debug|Win32 + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.Debug|Win32.Build.0 = Debug|Win32 + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.Release|Win32.ActiveCfg = Release|Win32 + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.Release|Win32.Build.0 = Release|Win32 + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {33C16464-831E-103A-5F37-65CCD4F9191F}.Debug|Win32.ActiveCfg = Debug|Win32 + {33C16464-831E-103A-5F37-65CCD4F9191F}.Debug|Win32.Build.0 = Debug|Win32 + {33C16464-831E-103A-5F37-65CCD4F9191F}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {33C16464-831E-103A-5F37-65CCD4F9191F}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {33C16464-831E-103A-5F37-65CCD4F9191F}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {33C16464-831E-103A-5F37-65CCD4F9191F}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {33C16464-831E-103A-5F37-65CCD4F9191F}.Release|Win32.ActiveCfg = Release|Win32 + {33C16464-831E-103A-5F37-65CCD4F9191F}.Release|Win32.Build.0 = Release|Win32 + {33C16464-831E-103A-5F37-65CCD4F9191F}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {33C16464-831E-103A-5F37-65CCD4F9191F}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {33C16464-831E-103A-5F37-65CCD4F9191F}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {33C16464-831E-103A-5F37-65CCD4F9191F}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.Debug|Win32.ActiveCfg = Debug|Win32 + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.Debug|Win32.Build.0 = Debug|Win32 + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.Release|Win32.ActiveCfg = Release|Win32 + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.Release|Win32.Build.0 = Release|Win32 + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Debug|Win32.ActiveCfg = Debug|Win32 + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Debug|Win32.Build.0 = Debug|Win32 + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Release|Win32.ActiveCfg = Release|Win32 + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Release|Win32.Build.0 = Release|Win32 + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.Debug|Win32.ActiveCfg = Debug|Win32 + {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.Debug|Win32.Build.0 = Debug|Win32 + {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.Release|Win32.ActiveCfg = Release|Win32 + {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.Release|Win32.Build.0 = Release|Win32 + {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {D423BB79-A5EE-4742-956D-69482488AF7C}.Debug|Win32.ActiveCfg = Debug|Win32 + {D423BB79-A5EE-4742-956D-69482488AF7C}.Debug|Win32.Build.0 = Debug|Win32 + {D423BB79-A5EE-4742-956D-69482488AF7C}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {D423BB79-A5EE-4742-956D-69482488AF7C}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {D423BB79-A5EE-4742-956D-69482488AF7C}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {D423BB79-A5EE-4742-956D-69482488AF7C}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {D423BB79-A5EE-4742-956D-69482488AF7C}.Release|Win32.ActiveCfg = Release|Win32 + {D423BB79-A5EE-4742-956D-69482488AF7C}.Release|Win32.Build.0 = Release|Win32 + {D423BB79-A5EE-4742-956D-69482488AF7C}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {D423BB79-A5EE-4742-956D-69482488AF7C}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {D423BB79-A5EE-4742-956D-69482488AF7C}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {D423BB79-A5EE-4742-956D-69482488AF7C}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {2D714360-B8EC-F8E0-ED74-E95336301075}.Debug|Win32.ActiveCfg = Debug|Win32 + {2D714360-B8EC-F8E0-ED74-E95336301075}.Debug|Win32.Build.0 = Debug|Win32 + {2D714360-B8EC-F8E0-ED74-E95336301075}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {2D714360-B8EC-F8E0-ED74-E95336301075}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {2D714360-B8EC-F8E0-ED74-E95336301075}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {2D714360-B8EC-F8E0-ED74-E95336301075}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {2D714360-B8EC-F8E0-ED74-E95336301075}.Release|Win32.ActiveCfg = Release|Win32 + {2D714360-B8EC-F8E0-ED74-E95336301075}.Release|Win32.Build.0 = Release|Win32 + {2D714360-B8EC-F8E0-ED74-E95336301075}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {2D714360-B8EC-F8E0-ED74-E95336301075}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {2D714360-B8EC-F8E0-ED74-E95336301075}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {2D714360-B8EC-F8E0-ED74-E95336301075}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {7C050627-6267-11A1-E342-374FA0095116}.Debug|Win32.ActiveCfg = Debug|Win32 + {7C050627-6267-11A1-E342-374FA0095116}.Debug|Win32.Build.0 = Debug|Win32 + {7C050627-6267-11A1-E342-374FA0095116}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {7C050627-6267-11A1-E342-374FA0095116}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {7C050627-6267-11A1-E342-374FA0095116}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {7C050627-6267-11A1-E342-374FA0095116}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {7C050627-6267-11A1-E342-374FA0095116}.Release|Win32.ActiveCfg = Release|Win32 + {7C050627-6267-11A1-E342-374FA0095116}.Release|Win32.Build.0 = Release|Win32 + {7C050627-6267-11A1-E342-374FA0095116}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {7C050627-6267-11A1-E342-374FA0095116}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {7C050627-6267-11A1-E342-374FA0095116}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {7C050627-6267-11A1-E342-374FA0095116}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {6D016A7B-39C8-2018-733F-22921BE94AC4}.Debug|Win32.ActiveCfg = Debug|Win32 + {6D016A7B-39C8-2018-733F-22921BE94AC4}.Debug|Win32.Build.0 = Debug|Win32 + {6D016A7B-39C8-2018-733F-22921BE94AC4}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {6D016A7B-39C8-2018-733F-22921BE94AC4}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {6D016A7B-39C8-2018-733F-22921BE94AC4}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {6D016A7B-39C8-2018-733F-22921BE94AC4}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {6D016A7B-39C8-2018-733F-22921BE94AC4}.Release|Win32.ActiveCfg = Release|Win32 + {6D016A7B-39C8-2018-733F-22921BE94AC4}.Release|Win32.Build.0 = Release|Win32 + {6D016A7B-39C8-2018-733F-22921BE94AC4}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {6D016A7B-39C8-2018-733F-22921BE94AC4}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {6D016A7B-39C8-2018-733F-22921BE94AC4}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {6D016A7B-39C8-2018-733F-22921BE94AC4}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.Debug|Win32.ActiveCfg = Debug|Win32 + {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.Debug|Win32.Build.0 = Debug|Win32 + {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.Release|Win32.ActiveCfg = Release|Win32 + {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.Release|Win32.Build.0 = Release|Win32 + {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {60F71B6A-F888-C449-EF49-268BB9F7C963}.Debug|Win32.ActiveCfg = Debug|Win32 + {60F71B6A-F888-C449-EF49-268BB9F7C963}.Debug|Win32.Build.0 = Debug|Win32 + {60F71B6A-F888-C449-EF49-268BB9F7C963}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {60F71B6A-F888-C449-EF49-268BB9F7C963}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {60F71B6A-F888-C449-EF49-268BB9F7C963}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {60F71B6A-F888-C449-EF49-268BB9F7C963}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {60F71B6A-F888-C449-EF49-268BB9F7C963}.Release|Win32.ActiveCfg = Release|Win32 + {60F71B6A-F888-C449-EF49-268BB9F7C963}.Release|Win32.Build.0 = Release|Win32 + {60F71B6A-F888-C449-EF49-268BB9F7C963}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {60F71B6A-F888-C449-EF49-268BB9F7C963}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {60F71B6A-F888-C449-EF49-268BB9F7C963}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {60F71B6A-F888-C449-EF49-268BB9F7C963}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {60A1DC9D-F837-3923-E9DE-A7925394A578}.Debug|Win32.ActiveCfg = Debug|Win32 + {60A1DC9D-F837-3923-E9DE-A7925394A578}.Debug|Win32.Build.0 = Debug|Win32 + {60A1DC9D-F837-3923-E9DE-A7925394A578}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {60A1DC9D-F837-3923-E9DE-A7925394A578}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {60A1DC9D-F837-3923-E9DE-A7925394A578}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {60A1DC9D-F837-3923-E9DE-A7925394A578}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {60A1DC9D-F837-3923-E9DE-A7925394A578}.Release|Win32.ActiveCfg = Release|Win32 + {60A1DC9D-F837-3923-E9DE-A7925394A578}.Release|Win32.Build.0 = Release|Win32 + {60A1DC9D-F837-3923-E9DE-A7925394A578}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {60A1DC9D-F837-3923-E9DE-A7925394A578}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {60A1DC9D-F837-3923-E9DE-A7925394A578}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {60A1DC9D-F837-3923-E9DE-A7925394A578}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.Debug|Win32.ActiveCfg = Debug|Win32 + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.Debug|Win32.Build.0 = Debug|Win32 + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.Release|Win32.ActiveCfg = Release|Win32 + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.Release|Win32.Build.0 = Release|Win32 + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.Debug|Win32.ActiveCfg = Debug|Win32 + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.Debug|Win32.Build.0 = Debug|Win32 + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.Release|Win32.ActiveCfg = Release|Win32 + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.Release|Win32.Build.0 = Release|Win32 + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.Debug|Win32.ActiveCfg = Debug|Win32 + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.Debug|Win32.Build.0 = Debug|Win32 + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.Release|Win32.ActiveCfg = Release|Win32 + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.Release|Win32.Build.0 = Release|Win32 + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {330B5049-6935-5CE6-79B7-28F570962895}.Debug|Win32.ActiveCfg = Debug|Win32 + {330B5049-6935-5CE6-79B7-28F570962895}.Debug|Win32.Build.0 = Debug|Win32 + {330B5049-6935-5CE6-79B7-28F570962895}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {330B5049-6935-5CE6-79B7-28F570962895}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {330B5049-6935-5CE6-79B7-28F570962895}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {330B5049-6935-5CE6-79B7-28F570962895}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {330B5049-6935-5CE6-79B7-28F570962895}.Release|Win32.ActiveCfg = Release|Win32 + {330B5049-6935-5CE6-79B7-28F570962895}.Release|Win32.Build.0 = Release|Win32 + {330B5049-6935-5CE6-79B7-28F570962895}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {330B5049-6935-5CE6-79B7-28F570962895}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {330B5049-6935-5CE6-79B7-28F570962895}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {330B5049-6935-5CE6-79B7-28F570962895}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.Debug|Win32.ActiveCfg = Debug|Win32 + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.Debug|Win32.Build.0 = Debug|Win32 + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.Release|Win32.ActiveCfg = Release|Win32 + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.Release|Win32.Build.0 = Release|Win32 + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {6210A080-01C0-6D67-F1DB-669393175402}.Debug|Win32.ActiveCfg = Debug|Win32 + {6210A080-01C0-6D67-F1DB-669393175402}.Debug|Win32.Build.0 = Debug|Win32 + {6210A080-01C0-6D67-F1DB-669393175402}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {6210A080-01C0-6D67-F1DB-669393175402}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {6210A080-01C0-6D67-F1DB-669393175402}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {6210A080-01C0-6D67-F1DB-669393175402}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {6210A080-01C0-6D67-F1DB-669393175402}.Release|Win32.ActiveCfg = Release|Win32 + {6210A080-01C0-6D67-F1DB-669393175402}.Release|Win32.Build.0 = Release|Win32 + {6210A080-01C0-6D67-F1DB-669393175402}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {6210A080-01C0-6D67-F1DB-669393175402}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {6210A080-01C0-6D67-F1DB-669393175402}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {6210A080-01C0-6D67-F1DB-669393175402}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {9E59B16D-0924-409C-1611-DF2207A0053F}.Debug|Win32.ActiveCfg = Debug|Win32 + {9E59B16D-0924-409C-1611-DF2207A0053F}.Debug|Win32.Build.0 = Debug|Win32 + {9E59B16D-0924-409C-1611-DF2207A0053F}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {9E59B16D-0924-409C-1611-DF2207A0053F}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {9E59B16D-0924-409C-1611-DF2207A0053F}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {9E59B16D-0924-409C-1611-DF2207A0053F}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {9E59B16D-0924-409C-1611-DF2207A0053F}.Release|Win32.ActiveCfg = Release|Win32 + {9E59B16D-0924-409C-1611-DF2207A0053F}.Release|Win32.Build.0 = Release|Win32 + {9E59B16D-0924-409C-1611-DF2207A0053F}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {9E59B16D-0924-409C-1611-DF2207A0053F}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {9E59B16D-0924-409C-1611-DF2207A0053F}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {9E59B16D-0924-409C-1611-DF2207A0053F}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Debug|Win32.ActiveCfg = Debug|Win32 + {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Debug|Win32.Build.0 = Debug|Win32 + {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Release|Win32.ActiveCfg = Release|Win32 + {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Release|Win32.Build.0 = Release|Win32 + {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.Debug|Win32.ActiveCfg = Debug|Win32 + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.Debug|Win32.Build.0 = Debug|Win32 + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.Release|Win32.ActiveCfg = Release|Win32 + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.Release|Win32.Build.0 = Release|Win32 + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug|Win32.ActiveCfg = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug|Win32.Build.0 = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release|Win32.ActiveCfg = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release|Win32.Build.0 = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug|Win32.ActiveCfg = Debug|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug|Win32.Build.0 = Debug|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release|Win32.ActiveCfg = Release|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release|Win32.Build.0 = Release|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|Win32.ActiveCfg = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|Win32.Build.0 = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|Win32.ActiveCfg = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|Win32.Build.0 = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.Debug|Win32.ActiveCfg = Debug|Win32 + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.Debug|Win32.Build.0 = Debug|Win32 + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.Release|Win32.ActiveCfg = Release|Win32 + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.Release|Win32.Build.0 = Release|Win32 + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.Debug|Win32.ActiveCfg = Debug|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.Debug|Win32.Build.0 = Debug|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.Release|Win32.ActiveCfg = Release|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.Release|Win32.Build.0 = Release|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {C04EA8AC-D96C-0E1F-0823-094C1010F087}.Debug|Win32.ActiveCfg = Debug|Win32 + {C04EA8AC-D96C-0E1F-0823-094C1010F087}.Debug|Win32.Build.0 = Debug|Win32 + {C04EA8AC-D96C-0E1F-0823-094C1010F087}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {C04EA8AC-D96C-0E1F-0823-094C1010F087}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {C04EA8AC-D96C-0E1F-0823-094C1010F087}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {C04EA8AC-D96C-0E1F-0823-094C1010F087}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {C04EA8AC-D96C-0E1F-0823-094C1010F087}.Release|Win32.ActiveCfg = Release|Win32 + {C04EA8AC-D96C-0E1F-0823-094C1010F087}.Release|Win32.Build.0 = Release|Win32 + {C04EA8AC-D96C-0E1F-0823-094C1010F087}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {C04EA8AC-D96C-0E1F-0823-094C1010F087}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {C04EA8AC-D96C-0E1F-0823-094C1010F087}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {C04EA8AC-D96C-0E1F-0823-094C1010F087}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {6AB01C9C-9163-F400-B5C3-20D046631E17}.Debug|Win32.ActiveCfg = Debug|Win32 + {6AB01C9C-9163-F400-B5C3-20D046631E17}.Debug|Win32.Build.0 = Debug|Win32 + {6AB01C9C-9163-F400-B5C3-20D046631E17}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {6AB01C9C-9163-F400-B5C3-20D046631E17}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {6AB01C9C-9163-F400-B5C3-20D046631E17}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {6AB01C9C-9163-F400-B5C3-20D046631E17}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {6AB01C9C-9163-F400-B5C3-20D046631E17}.Release|Win32.ActiveCfg = Release|Win32 + {6AB01C9C-9163-F400-B5C3-20D046631E17}.Release|Win32.Build.0 = Release|Win32 + {6AB01C9C-9163-F400-B5C3-20D046631E17}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {6AB01C9C-9163-F400-B5C3-20D046631E17}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {6AB01C9C-9163-F400-B5C3-20D046631E17}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {6AB01C9C-9163-F400-B5C3-20D046631E17}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Debug|Win32.ActiveCfg = Debug|Win32 + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Debug|Win32.Build.0 = Debug|Win32 + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Release|Win32.ActiveCfg = Release|Win32 + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Release|Win32.Build.0 = Release|Win32 + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {B1B5F775-54A9-2437-E4AC-7E817E492142}.Debug|Win32.ActiveCfg = Debug|Win32 + {B1B5F775-54A9-2437-E4AC-7E817E492142}.Debug|Win32.Build.0 = Debug|Win32 + {B1B5F775-54A9-2437-E4AC-7E817E492142}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {B1B5F775-54A9-2437-E4AC-7E817E492142}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {B1B5F775-54A9-2437-E4AC-7E817E492142}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {B1B5F775-54A9-2437-E4AC-7E817E492142}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {B1B5F775-54A9-2437-E4AC-7E817E492142}.Release|Win32.ActiveCfg = Release|Win32 + {B1B5F775-54A9-2437-E4AC-7E817E492142}.Release|Win32.Build.0 = Release|Win32 + {B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.Debug|Win32.ActiveCfg = Debug|Win32 + {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.Debug|Win32.Build.0 = Debug|Win32 + {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.Release|Win32.ActiveCfg = Release|Win32 + {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.Release|Win32.Build.0 = Release|Win32 + {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {0E48992F-80FB-7458-8BAF-A7054C73558F}.Debug|Win32.ActiveCfg = Debug|Win32 + {0E48992F-80FB-7458-8BAF-A7054C73558F}.Debug|Win32.Build.0 = Debug|Win32 + {0E48992F-80FB-7458-8BAF-A7054C73558F}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {0E48992F-80FB-7458-8BAF-A7054C73558F}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {0E48992F-80FB-7458-8BAF-A7054C73558F}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {0E48992F-80FB-7458-8BAF-A7054C73558F}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {0E48992F-80FB-7458-8BAF-A7054C73558F}.Release|Win32.ActiveCfg = Release|Win32 + {0E48992F-80FB-7458-8BAF-A7054C73558F}.Release|Win32.Build.0 = Release|Win32 + {0E48992F-80FB-7458-8BAF-A7054C73558F}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {0E48992F-80FB-7458-8BAF-A7054C73558F}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {0E48992F-80FB-7458-8BAF-A7054C73558F}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {0E48992F-80FB-7458-8BAF-A7054C73558F}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {A0958CD9-0E39-4A77-3711-9B488F508FBF}.Debug|Win32.ActiveCfg = Debug|Win32 + {A0958CD9-0E39-4A77-3711-9B488F508FBF}.Debug|Win32.Build.0 = Debug|Win32 + {A0958CD9-0E39-4A77-3711-9B488F508FBF}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {A0958CD9-0E39-4A77-3711-9B488F508FBF}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {A0958CD9-0E39-4A77-3711-9B488F508FBF}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {A0958CD9-0E39-4A77-3711-9B488F508FBF}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {A0958CD9-0E39-4A77-3711-9B488F508FBF}.Release|Win32.ActiveCfg = Release|Win32 + {A0958CD9-0E39-4A77-3711-9B488F508FBF}.Release|Win32.Build.0 = Release|Win32 + {A0958CD9-0E39-4A77-3711-9B488F508FBF}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {A0958CD9-0E39-4A77-3711-9B488F508FBF}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {A0958CD9-0E39-4A77-3711-9B488F508FBF}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {A0958CD9-0E39-4A77-3711-9B488F508FBF}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {6611E163-4570-42F7-B746-F0176D26E080}.Debug|Win32.ActiveCfg = Debug|Win32 + {6611E163-4570-42F7-B746-F0176D26E080}.Debug|Win32.Build.0 = Debug|Win32 + {6611E163-4570-42F7-B746-F0176D26E080}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {6611E163-4570-42F7-B746-F0176D26E080}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {6611E163-4570-42F7-B746-F0176D26E080}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {6611E163-4570-42F7-B746-F0176D26E080}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {6611E163-4570-42F7-B746-F0176D26E080}.Release|Win32.ActiveCfg = Release|Win32 + {6611E163-4570-42F7-B746-F0176D26E080}.Release|Win32.Build.0 = Release|Win32 + {6611E163-4570-42F7-B746-F0176D26E080}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {6611E163-4570-42F7-B746-F0176D26E080}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {6611E163-4570-42F7-B746-F0176D26E080}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {6611E163-4570-42F7-B746-F0176D26E080}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.Release.ActiveCfg = Release|Win32 - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.Release.Build.0 = Release|Win32 - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.Debug.ActiveCfg = Debug|Win32 - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.Debug.Build.0 = Debug|Win32 - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.DebugDll.ActiveCfg = DebugDll|Win32 - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.DebugDll.Build.0 = DebugDll|Win32 - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {7CE54E12-D3D5-878F-9CC5-786265A3F9CE}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Release.ActiveCfg = Release|Win32 - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Release.Build.0 = Release|Win32 - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Debug.ActiveCfg = Debug|Win32 - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Debug.Build.0 = Debug|Win32 - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDll.ActiveCfg = DebugDll|Win32 - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDll.Build.0 = DebugDll|Win32 - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {67034B5D-16DD-DC97-82F6-23B9E6108940}.Release.ActiveCfg = Release|Win32 - {67034B5D-16DD-DC97-82F6-23B9E6108940}.Release.Build.0 = Release|Win32 - {67034B5D-16DD-DC97-82F6-23B9E6108940}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {67034B5D-16DD-DC97-82F6-23B9E6108940}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {67034B5D-16DD-DC97-82F6-23B9E6108940}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {67034B5D-16DD-DC97-82F6-23B9E6108940}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {67034B5D-16DD-DC97-82F6-23B9E6108940}.Debug.ActiveCfg = Debug|Win32 - {67034B5D-16DD-DC97-82F6-23B9E6108940}.Debug.Build.0 = Debug|Win32 - {67034B5D-16DD-DC97-82F6-23B9E6108940}.DebugDll.ActiveCfg = DebugDll|Win32 - {67034B5D-16DD-DC97-82F6-23B9E6108940}.DebugDll.Build.0 = DebugDll|Win32 - {67034B5D-16DD-DC97-82F6-23B9E6108940}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {67034B5D-16DD-DC97-82F6-23B9E6108940}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.Release.ActiveCfg = Release|Win32 - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.Release.Build.0 = Release|Win32 - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.Debug.ActiveCfg = Debug|Win32 - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.Debug.Build.0 = Debug|Win32 - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.DebugDll.ActiveCfg = DebugDll|Win32 - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.DebugDll.Build.0 = DebugDll|Win32 - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {255A379C-F159-5362-4024-D5ADB9F5FBD2}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.Release.ActiveCfg = Release|Win32 - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.Release.Build.0 = Release|Win32 - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.Debug.ActiveCfg = Debug|Win32 - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.Debug.Build.0 = Debug|Win32 - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.DebugDll.ActiveCfg = DebugDll|Win32 - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.DebugDll.Build.0 = DebugDll|Win32 - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {2707A1D2-F23C-0C78-B99B-AA148865D6DD}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {7284F809-AF30-6315-88C6-86F1C0798760}.Release.ActiveCfg = Release|Win32 - {7284F809-AF30-6315-88C6-86F1C0798760}.Release.Build.0 = Release|Win32 - {7284F809-AF30-6315-88C6-86F1C0798760}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {7284F809-AF30-6315-88C6-86F1C0798760}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {7284F809-AF30-6315-88C6-86F1C0798760}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {7284F809-AF30-6315-88C6-86F1C0798760}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {7284F809-AF30-6315-88C6-86F1C0798760}.Debug.ActiveCfg = Debug|Win32 - {7284F809-AF30-6315-88C6-86F1C0798760}.Debug.Build.0 = Debug|Win32 - {7284F809-AF30-6315-88C6-86F1C0798760}.DebugDll.ActiveCfg = DebugDll|Win32 - {7284F809-AF30-6315-88C6-86F1C0798760}.DebugDll.Build.0 = DebugDll|Win32 - {7284F809-AF30-6315-88C6-86F1C0798760}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {7284F809-AF30-6315-88C6-86F1C0798760}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.Release.ActiveCfg = Release|Win32 - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.Release.Build.0 = Release|Win32 - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.Debug.ActiveCfg = Debug|Win32 - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.Debug.Build.0 = Debug|Win32 - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.DebugDll.ActiveCfg = DebugDll|Win32 - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.DebugDll.Build.0 = DebugDll|Win32 - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {06166AA4-DDAE-0CA9-6D52-DA45A1965B88}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Release.ActiveCfg = Release|Win32 - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Release.Build.0 = Release|Win32 - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Debug.ActiveCfg = Debug|Win32 - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.Debug.Build.0 = Debug|Win32 - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.DebugDll.ActiveCfg = DebugDll|Win32 - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.DebugDll.Build.0 = DebugDll|Win32 - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {D7BF5DDA-C097-9E8B-5EC1-40DE45FB46BF}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Release.ActiveCfg = Release|Win32 - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Release.Build.0 = Release|Win32 - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Debug.ActiveCfg = Debug|Win32 - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.Debug.Build.0 = Debug|Win32 - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.DebugDll.ActiveCfg = DebugDll|Win32 - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.DebugDll.Build.0 = DebugDll|Win32 - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {E70DB92E-C1F5-AE72-F9E2-DB9B4B3DBEC9}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Release.ActiveCfg = Release|Win32 - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Release.Build.0 = Release|Win32 - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Debug.ActiveCfg = Debug|Win32 - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.Debug.Build.0 = Debug|Win32 - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.DebugDll.ActiveCfg = DebugDll|Win32 - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.DebugDll.Build.0 = DebugDll|Win32 - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {F38629D2-EEB2-1A09-FB82-52B8A8DE759B}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Release.ActiveCfg = Release|Win32 - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Release.Build.0 = Release|Win32 - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Debug.ActiveCfg = Debug|Win32 - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.Debug.Build.0 = Debug|Win32 - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.DebugDll.ActiveCfg = DebugDll|Win32 - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.DebugDll.Build.0 = DebugDll|Win32 - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {B94C19C6-F6E7-2F60-56E2-E0BA681B74B3}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {DAA547D0-0166-C085-0F93-B88CAB800F97}.Release.ActiveCfg = Release|Win32 - {DAA547D0-0166-C085-0F93-B88CAB800F97}.Release.Build.0 = Release|Win32 - {DAA547D0-0166-C085-0F93-B88CAB800F97}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {DAA547D0-0166-C085-0F93-B88CAB800F97}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {DAA547D0-0166-C085-0F93-B88CAB800F97}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {DAA547D0-0166-C085-0F93-B88CAB800F97}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {DAA547D0-0166-C085-0F93-B88CAB800F97}.Debug.ActiveCfg = Debug|Win32 - {DAA547D0-0166-C085-0F93-B88CAB800F97}.Debug.Build.0 = Debug|Win32 - {DAA547D0-0166-C085-0F93-B88CAB800F97}.DebugDll.ActiveCfg = DebugDll|Win32 - {DAA547D0-0166-C085-0F93-B88CAB800F97}.DebugDll.Build.0 = DebugDll|Win32 - {DAA547D0-0166-C085-0F93-B88CAB800F97}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {DAA547D0-0166-C085-0F93-B88CAB800F97}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.Release.ActiveCfg = Release|Win32 - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.Release.Build.0 = Release|Win32 - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.Debug.ActiveCfg = Debug|Win32 - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.Debug.Build.0 = Debug|Win32 - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.DebugDll.ActiveCfg = DebugDll|Win32 - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.DebugDll.Build.0 = DebugDll|Win32 - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {801CB6D4-A45C-C9D2-B176-9711A74B9164}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {69C821C7-1E18-D894-068D-C55E063F4859}.Release.ActiveCfg = Release|Win32 - {69C821C7-1E18-D894-068D-C55E063F4859}.Release.Build.0 = Release|Win32 - {69C821C7-1E18-D894-068D-C55E063F4859}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {69C821C7-1E18-D894-068D-C55E063F4859}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {69C821C7-1E18-D894-068D-C55E063F4859}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {69C821C7-1E18-D894-068D-C55E063F4859}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {69C821C7-1E18-D894-068D-C55E063F4859}.Debug.ActiveCfg = Debug|Win32 - {69C821C7-1E18-D894-068D-C55E063F4859}.Debug.Build.0 = Debug|Win32 - {69C821C7-1E18-D894-068D-C55E063F4859}.DebugDll.ActiveCfg = DebugDll|Win32 - {69C821C7-1E18-D894-068D-C55E063F4859}.DebugDll.Build.0 = DebugDll|Win32 - {69C821C7-1E18-D894-068D-C55E063F4859}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {69C821C7-1E18-D894-068D-C55E063F4859}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {E2707D44-8B82-55F1-6C5A-D03B19159248}.Release.ActiveCfg = Release|Win32 - {E2707D44-8B82-55F1-6C5A-D03B19159248}.Release.Build.0 = Release|Win32 - {E2707D44-8B82-55F1-6C5A-D03B19159248}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {E2707D44-8B82-55F1-6C5A-D03B19159248}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {E2707D44-8B82-55F1-6C5A-D03B19159248}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {E2707D44-8B82-55F1-6C5A-D03B19159248}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {E2707D44-8B82-55F1-6C5A-D03B19159248}.Debug.ActiveCfg = Debug|Win32 - {E2707D44-8B82-55F1-6C5A-D03B19159248}.Debug.Build.0 = Debug|Win32 - {E2707D44-8B82-55F1-6C5A-D03B19159248}.DebugDll.ActiveCfg = DebugDll|Win32 - {E2707D44-8B82-55F1-6C5A-D03B19159248}.DebugDll.Build.0 = DebugDll|Win32 - {E2707D44-8B82-55F1-6C5A-D03B19159248}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {E2707D44-8B82-55F1-6C5A-D03B19159248}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.Release.ActiveCfg = Release|Win32 - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.Release.Build.0 = Release|Win32 - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.Debug.ActiveCfg = Debug|Win32 - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.Debug.Build.0 = Debug|Win32 - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.DebugDll.ActiveCfg = DebugDll|Win32 - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.DebugDll.Build.0 = DebugDll|Win32 - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {1125C7F3-9E0D-27B1-C97B-CDAB5CE161A3}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.Release.ActiveCfg = Release|Win32 - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.Release.Build.0 = Release|Win32 - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.Debug.ActiveCfg = Debug|Win32 - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.Debug.Build.0 = Debug|Win32 - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.DebugDll.ActiveCfg = DebugDll|Win32 - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.DebugDll.Build.0 = DebugDll|Win32 - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {4FF98546-7A0D-00AA-743C-F1EA15BC00E2}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {33C16464-831E-103A-5F37-65CCD4F9191F}.Release.ActiveCfg = Release|Win32 - {33C16464-831E-103A-5F37-65CCD4F9191F}.Release.Build.0 = Release|Win32 - {33C16464-831E-103A-5F37-65CCD4F9191F}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {33C16464-831E-103A-5F37-65CCD4F9191F}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {33C16464-831E-103A-5F37-65CCD4F9191F}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {33C16464-831E-103A-5F37-65CCD4F9191F}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {33C16464-831E-103A-5F37-65CCD4F9191F}.Debug.ActiveCfg = Debug|Win32 - {33C16464-831E-103A-5F37-65CCD4F9191F}.Debug.Build.0 = Debug|Win32 - {33C16464-831E-103A-5F37-65CCD4F9191F}.DebugDll.ActiveCfg = DebugDll|Win32 - {33C16464-831E-103A-5F37-65CCD4F9191F}.DebugDll.Build.0 = DebugDll|Win32 - {33C16464-831E-103A-5F37-65CCD4F9191F}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {33C16464-831E-103A-5F37-65CCD4F9191F}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.Release.ActiveCfg = Release|Win32 - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.Release.Build.0 = Release|Win32 - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.Debug.ActiveCfg = Debug|Win32 - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.Debug.Build.0 = Debug|Win32 - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.DebugDll.ActiveCfg = DebugDll|Win32 - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.DebugDll.Build.0 = DebugDll|Win32 - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {12B291F0-1880-AFC5-26E1-26DF78EA6D2E}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Release.ActiveCfg = Release|Win32 - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Release.Build.0 = Release|Win32 - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Debug.ActiveCfg = Debug|Win32 - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.Debug.Build.0 = Debug|Win32 - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.DebugDll.ActiveCfg = DebugDll|Win32 - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.DebugDll.Build.0 = DebugDll|Win32 - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {780752A8-6322-5D3E-EF42-D0FD8BF9CEA1}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.Release.ActiveCfg = Release|Win32 - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.Release.Build.0 = Release|Win32 - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.Debug.ActiveCfg = Debug|Win32 - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.Debug.Build.0 = Debug|Win32 - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.DebugDll.ActiveCfg = DebugDll|Win32 - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.DebugDll.Build.0 = DebugDll|Win32 - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {5239CE6A-7C7A-2170-6334-DF8EE0C44543}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {D423BB79-A5EE-4742-956D-69482488AF7C}.Release.ActiveCfg = Release|Win32 - {D423BB79-A5EE-4742-956D-69482488AF7C}.Release.Build.0 = Release|Win32 - {D423BB79-A5EE-4742-956D-69482488AF7C}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {D423BB79-A5EE-4742-956D-69482488AF7C}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {D423BB79-A5EE-4742-956D-69482488AF7C}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {D423BB79-A5EE-4742-956D-69482488AF7C}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {D423BB79-A5EE-4742-956D-69482488AF7C}.Debug.ActiveCfg = Debug|Win32 - {D423BB79-A5EE-4742-956D-69482488AF7C}.Debug.Build.0 = Debug|Win32 - {D423BB79-A5EE-4742-956D-69482488AF7C}.DebugDll.ActiveCfg = DebugDll|Win32 - {D423BB79-A5EE-4742-956D-69482488AF7C}.DebugDll.Build.0 = DebugDll|Win32 - {D423BB79-A5EE-4742-956D-69482488AF7C}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {D423BB79-A5EE-4742-956D-69482488AF7C}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {2D714360-B8EC-F8E0-ED74-E95336301075}.Release.ActiveCfg = Release|Win32 - {2D714360-B8EC-F8E0-ED74-E95336301075}.Release.Build.0 = Release|Win32 - {2D714360-B8EC-F8E0-ED74-E95336301075}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {2D714360-B8EC-F8E0-ED74-E95336301075}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {2D714360-B8EC-F8E0-ED74-E95336301075}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {2D714360-B8EC-F8E0-ED74-E95336301075}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {2D714360-B8EC-F8E0-ED74-E95336301075}.Debug.ActiveCfg = Debug|Win32 - {2D714360-B8EC-F8E0-ED74-E95336301075}.Debug.Build.0 = Debug|Win32 - {2D714360-B8EC-F8E0-ED74-E95336301075}.DebugDll.ActiveCfg = DebugDll|Win32 - {2D714360-B8EC-F8E0-ED74-E95336301075}.DebugDll.Build.0 = DebugDll|Win32 - {2D714360-B8EC-F8E0-ED74-E95336301075}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {2D714360-B8EC-F8E0-ED74-E95336301075}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {7C050627-6267-11A1-E342-374FA0095116}.Release.ActiveCfg = Release|Win32 - {7C050627-6267-11A1-E342-374FA0095116}.Release.Build.0 = Release|Win32 - {7C050627-6267-11A1-E342-374FA0095116}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {7C050627-6267-11A1-E342-374FA0095116}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {7C050627-6267-11A1-E342-374FA0095116}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {7C050627-6267-11A1-E342-374FA0095116}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {7C050627-6267-11A1-E342-374FA0095116}.Debug.ActiveCfg = Debug|Win32 - {7C050627-6267-11A1-E342-374FA0095116}.Debug.Build.0 = Debug|Win32 - {7C050627-6267-11A1-E342-374FA0095116}.DebugDll.ActiveCfg = DebugDll|Win32 - {7C050627-6267-11A1-E342-374FA0095116}.DebugDll.Build.0 = DebugDll|Win32 - {7C050627-6267-11A1-E342-374FA0095116}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {7C050627-6267-11A1-E342-374FA0095116}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {6D016A7B-39C8-2018-733F-22921BE94AC4}.Release.ActiveCfg = Release|Win32 - {6D016A7B-39C8-2018-733F-22921BE94AC4}.Release.Build.0 = Release|Win32 - {6D016A7B-39C8-2018-733F-22921BE94AC4}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {6D016A7B-39C8-2018-733F-22921BE94AC4}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {6D016A7B-39C8-2018-733F-22921BE94AC4}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {6D016A7B-39C8-2018-733F-22921BE94AC4}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {6D016A7B-39C8-2018-733F-22921BE94AC4}.Debug.ActiveCfg = Debug|Win32 - {6D016A7B-39C8-2018-733F-22921BE94AC4}.Debug.Build.0 = Debug|Win32 - {6D016A7B-39C8-2018-733F-22921BE94AC4}.DebugDll.ActiveCfg = DebugDll|Win32 - {6D016A7B-39C8-2018-733F-22921BE94AC4}.DebugDll.Build.0 = DebugDll|Win32 - {6D016A7B-39C8-2018-733F-22921BE94AC4}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {6D016A7B-39C8-2018-733F-22921BE94AC4}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.Release.ActiveCfg = Release|Win32 - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.Release.Build.0 = Release|Win32 - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.Debug.ActiveCfg = Debug|Win32 - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.Debug.Build.0 = Debug|Win32 - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.DebugDll.ActiveCfg = DebugDll|Win32 - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.DebugDll.Build.0 = DebugDll|Win32 - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {EFEF2072-51F9-DAE8-AC38-3E653C680F74}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {60F71B6A-F888-C449-EF49-268BB9F7C963}.Release.ActiveCfg = Release|Win32 - {60F71B6A-F888-C449-EF49-268BB9F7C963}.Release.Build.0 = Release|Win32 - {60F71B6A-F888-C449-EF49-268BB9F7C963}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {60F71B6A-F888-C449-EF49-268BB9F7C963}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {60F71B6A-F888-C449-EF49-268BB9F7C963}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {60F71B6A-F888-C449-EF49-268BB9F7C963}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {60F71B6A-F888-C449-EF49-268BB9F7C963}.Debug.ActiveCfg = Debug|Win32 - {60F71B6A-F888-C449-EF49-268BB9F7C963}.Debug.Build.0 = Debug|Win32 - {60F71B6A-F888-C449-EF49-268BB9F7C963}.DebugDll.ActiveCfg = DebugDll|Win32 - {60F71B6A-F888-C449-EF49-268BB9F7C963}.DebugDll.Build.0 = DebugDll|Win32 - {60F71B6A-F888-C449-EF49-268BB9F7C963}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {60F71B6A-F888-C449-EF49-268BB9F7C963}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {60A1DC9D-F837-3923-E9DE-A7925394A578}.Release.ActiveCfg = Release|Win32 - {60A1DC9D-F837-3923-E9DE-A7925394A578}.Release.Build.0 = Release|Win32 - {60A1DC9D-F837-3923-E9DE-A7925394A578}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {60A1DC9D-F837-3923-E9DE-A7925394A578}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {60A1DC9D-F837-3923-E9DE-A7925394A578}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {60A1DC9D-F837-3923-E9DE-A7925394A578}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {60A1DC9D-F837-3923-E9DE-A7925394A578}.Debug.ActiveCfg = Debug|Win32 - {60A1DC9D-F837-3923-E9DE-A7925394A578}.Debug.Build.0 = Debug|Win32 - {60A1DC9D-F837-3923-E9DE-A7925394A578}.DebugDll.ActiveCfg = DebugDll|Win32 - {60A1DC9D-F837-3923-E9DE-A7925394A578}.DebugDll.Build.0 = DebugDll|Win32 - {60A1DC9D-F837-3923-E9DE-A7925394A578}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {60A1DC9D-F837-3923-E9DE-A7925394A578}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.Release.ActiveCfg = Release|Win32 - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.Release.Build.0 = Release|Win32 - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.Debug.ActiveCfg = Debug|Win32 - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.Debug.Build.0 = Debug|Win32 - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.DebugDll.ActiveCfg = DebugDll|Win32 - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.DebugDll.Build.0 = DebugDll|Win32 - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {E7461CAA-D8C1-90D0-FB1E-FCD4F340FAAE}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.Release.ActiveCfg = Release|Win32 - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.Release.Build.0 = Release|Win32 - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.Debug.ActiveCfg = Debug|Win32 - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.Debug.Build.0 = Debug|Win32 - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.DebugDll.ActiveCfg = DebugDll|Win32 - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.DebugDll.Build.0 = DebugDll|Win32 - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {106E3D23-110E-5DD8-4A6A-D8A2250C43C9}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.Release.ActiveCfg = Release|Win32 - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.Release.Build.0 = Release|Win32 - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.Debug.ActiveCfg = Debug|Win32 - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.Debug.Build.0 = Debug|Win32 - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.DebugDll.ActiveCfg = DebugDll|Win32 - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.DebugDll.Build.0 = DebugDll|Win32 - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {7FE87C67-4B29-D636-0AEC-BFFCE47A2164}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {330B5049-6935-5CE6-79B7-28F570962895}.Release.ActiveCfg = Release|Win32 - {330B5049-6935-5CE6-79B7-28F570962895}.Release.Build.0 = Release|Win32 - {330B5049-6935-5CE6-79B7-28F570962895}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {330B5049-6935-5CE6-79B7-28F570962895}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {330B5049-6935-5CE6-79B7-28F570962895}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {330B5049-6935-5CE6-79B7-28F570962895}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {330B5049-6935-5CE6-79B7-28F570962895}.Debug.ActiveCfg = Debug|Win32 - {330B5049-6935-5CE6-79B7-28F570962895}.Debug.Build.0 = Debug|Win32 - {330B5049-6935-5CE6-79B7-28F570962895}.DebugDll.ActiveCfg = DebugDll|Win32 - {330B5049-6935-5CE6-79B7-28F570962895}.DebugDll.Build.0 = DebugDll|Win32 - {330B5049-6935-5CE6-79B7-28F570962895}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {330B5049-6935-5CE6-79B7-28F570962895}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.Release.ActiveCfg = Release|Win32 - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.Release.Build.0 = Release|Win32 - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.Debug.ActiveCfg = Debug|Win32 - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.Debug.Build.0 = Debug|Win32 - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.DebugDll.ActiveCfg = DebugDll|Win32 - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.DebugDll.Build.0 = DebugDll|Win32 - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {07E712DB-DAF8-887E-F099-CE43D4E8B1F9}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {6210A080-01C0-6D67-F1DB-669393175402}.Release.ActiveCfg = Release|Win32 - {6210A080-01C0-6D67-F1DB-669393175402}.Release.Build.0 = Release|Win32 - {6210A080-01C0-6D67-F1DB-669393175402}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {6210A080-01C0-6D67-F1DB-669393175402}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {6210A080-01C0-6D67-F1DB-669393175402}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {6210A080-01C0-6D67-F1DB-669393175402}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {6210A080-01C0-6D67-F1DB-669393175402}.Debug.ActiveCfg = Debug|Win32 - {6210A080-01C0-6D67-F1DB-669393175402}.Debug.Build.0 = Debug|Win32 - {6210A080-01C0-6D67-F1DB-669393175402}.DebugDll.ActiveCfg = DebugDll|Win32 - {6210A080-01C0-6D67-F1DB-669393175402}.DebugDll.Build.0 = DebugDll|Win32 - {6210A080-01C0-6D67-F1DB-669393175402}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {6210A080-01C0-6D67-F1DB-669393175402}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {9E59B16D-0924-409C-1611-DF2207A0053F}.Release.ActiveCfg = Release|Win32 - {9E59B16D-0924-409C-1611-DF2207A0053F}.Release.Build.0 = Release|Win32 - {9E59B16D-0924-409C-1611-DF2207A0053F}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {9E59B16D-0924-409C-1611-DF2207A0053F}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {9E59B16D-0924-409C-1611-DF2207A0053F}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {9E59B16D-0924-409C-1611-DF2207A0053F}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {9E59B16D-0924-409C-1611-DF2207A0053F}.Debug.ActiveCfg = Debug|Win32 - {9E59B16D-0924-409C-1611-DF2207A0053F}.Debug.Build.0 = Debug|Win32 - {9E59B16D-0924-409C-1611-DF2207A0053F}.DebugDll.ActiveCfg = DebugDll|Win32 - {9E59B16D-0924-409C-1611-DF2207A0053F}.DebugDll.Build.0 = DebugDll|Win32 - {9E59B16D-0924-409C-1611-DF2207A0053F}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {9E59B16D-0924-409C-1611-DF2207A0053F}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Release.ActiveCfg = Release|Win32 - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Release.Build.0 = Release|Win32 - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Debug.ActiveCfg = Debug|Win32 - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.Debug.Build.0 = Debug|Win32 - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.DebugDll.ActiveCfg = DebugDll|Win32 - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.DebugDll.Build.0 = DebugDll|Win32 - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {DFAF0062-4CD7-9AB8-0683-A6026B326F56}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.Release.ActiveCfg = Release|Win32 - {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.Release.Build.0 = Release|Win32 - {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.Debug.ActiveCfg = Debug|Win32 - {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.Debug.Build.0 = Debug|Win32 - {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.DebugDll.ActiveCfg = DebugDll|Win32 - {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.DebugDll.Build.0 = DebugDll|Win32 - {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release.ActiveCfg = Release|Win32 - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release.Build.0 = Release|Win32 - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug.ActiveCfg = Debug|Win32 - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug.Build.0 = Debug|Win32 - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll.ActiveCfg = DebugDll|Win32 - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll.Build.0 = DebugDll|Win32 - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release.ActiveCfg = Release|Win32 - {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release.Build.0 = Release|Win32 - {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug.ActiveCfg = Debug|Win32 - {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug.Build.0 = Debug|Win32 - {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDll.ActiveCfg = DebugDll|Win32 - {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDll.Build.0 = DebugDll|Win32 - {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release.ActiveCfg = Release|Win32 - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release.Build.0 = Release|Win32 - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug.ActiveCfg = Debug|Win32 - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug.Build.0 = Debug|Win32 - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll.ActiveCfg = DebugDll|Win32 - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll.Build.0 = DebugDll|Win32 - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.Release.ActiveCfg = Release|Win32 - {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.Release.Build.0 = Release|Win32 - {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.Debug.ActiveCfg = Debug|Win32 - {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.Debug.Build.0 = Debug|Win32 - {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.DebugDll.ActiveCfg = DebugDll|Win32 - {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.DebugDll.Build.0 = DebugDll|Win32 - {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {A24D77FD-D69A-75A0-A7DC-730894C9D0F7}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {7C428E76-9271-6284-20F0-9B38ED6931E3}.Release.ActiveCfg = Release|Win32 - {7C428E76-9271-6284-20F0-9B38ED6931E3}.Release.Build.0 = Release|Win32 - {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {7C428E76-9271-6284-20F0-9B38ED6931E3}.Debug.ActiveCfg = Debug|Win32 - {7C428E76-9271-6284-20F0-9B38ED6931E3}.Debug.Build.0 = Debug|Win32 - {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDll.ActiveCfg = DebugDll|Win32 - {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDll.Build.0 = DebugDll|Win32 - {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {C04EA8AC-D96C-0E1F-0823-094C1010F087}.Release.ActiveCfg = Release|Win32 - {C04EA8AC-D96C-0E1F-0823-094C1010F087}.Release.Build.0 = Release|Win32 - {C04EA8AC-D96C-0E1F-0823-094C1010F087}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {C04EA8AC-D96C-0E1F-0823-094C1010F087}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {C04EA8AC-D96C-0E1F-0823-094C1010F087}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {C04EA8AC-D96C-0E1F-0823-094C1010F087}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {C04EA8AC-D96C-0E1F-0823-094C1010F087}.Debug.ActiveCfg = Debug|Win32 - {C04EA8AC-D96C-0E1F-0823-094C1010F087}.Debug.Build.0 = Debug|Win32 - {C04EA8AC-D96C-0E1F-0823-094C1010F087}.DebugDll.ActiveCfg = DebugDll|Win32 - {C04EA8AC-D96C-0E1F-0823-094C1010F087}.DebugDll.Build.0 = DebugDll|Win32 - {C04EA8AC-D96C-0E1F-0823-094C1010F087}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {C04EA8AC-D96C-0E1F-0823-094C1010F087}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {6AB01C9C-9163-F400-B5C3-20D046631E17}.Release.ActiveCfg = Release|Win32 - {6AB01C9C-9163-F400-B5C3-20D046631E17}.Release.Build.0 = Release|Win32 - {6AB01C9C-9163-F400-B5C3-20D046631E17}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {6AB01C9C-9163-F400-B5C3-20D046631E17}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {6AB01C9C-9163-F400-B5C3-20D046631E17}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {6AB01C9C-9163-F400-B5C3-20D046631E17}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {6AB01C9C-9163-F400-B5C3-20D046631E17}.Debug.ActiveCfg = Debug|Win32 - {6AB01C9C-9163-F400-B5C3-20D046631E17}.Debug.Build.0 = Debug|Win32 - {6AB01C9C-9163-F400-B5C3-20D046631E17}.DebugDll.ActiveCfg = DebugDll|Win32 - {6AB01C9C-9163-F400-B5C3-20D046631E17}.DebugDll.Build.0 = DebugDll|Win32 - {6AB01C9C-9163-F400-B5C3-20D046631E17}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {6AB01C9C-9163-F400-B5C3-20D046631E17}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Release.ActiveCfg = Release|Win32 - {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Release.Build.0 = Release|Win32 - {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Debug.ActiveCfg = Debug|Win32 - {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.Debug.Build.0 = Debug|Win32 - {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.DebugDll.ActiveCfg = DebugDll|Win32 - {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.DebugDll.Build.0 = DebugDll|Win32 - {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {8050F819-5B5B-1504-BC6D-7F2B4C6C85F3}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {B1B5F775-54A9-2437-E4AC-7E817E492142}.Release.ActiveCfg = Release|Win32 - {B1B5F775-54A9-2437-E4AC-7E817E492142}.Release.Build.0 = Release|Win32 - {B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {B1B5F775-54A9-2437-E4AC-7E817E492142}.Debug.ActiveCfg = Debug|Win32 - {B1B5F775-54A9-2437-E4AC-7E817E492142}.Debug.Build.0 = Debug|Win32 - {B1B5F775-54A9-2437-E4AC-7E817E492142}.DebugDll.ActiveCfg = DebugDll|Win32 - {B1B5F775-54A9-2437-E4AC-7E817E492142}.DebugDll.Build.0 = DebugDll|Win32 - {B1B5F775-54A9-2437-E4AC-7E817E492142}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {B1B5F775-54A9-2437-E4AC-7E817E492142}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.Release.ActiveCfg = Release|Win32 - {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.Release.Build.0 = Release|Win32 - {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.Debug.ActiveCfg = Debug|Win32 - {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.Debug.Build.0 = Debug|Win32 - {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.DebugDll.ActiveCfg = DebugDll|Win32 - {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.DebugDll.Build.0 = DebugDll|Win32 - {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {81819498-F4A8-E0CA-8ED5-724E27AB34E7}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {0E48992F-80FB-7458-8BAF-A7054C73558F}.Release.ActiveCfg = Release|Win32 - {0E48992F-80FB-7458-8BAF-A7054C73558F}.Release.Build.0 = Release|Win32 - {0E48992F-80FB-7458-8BAF-A7054C73558F}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {0E48992F-80FB-7458-8BAF-A7054C73558F}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {0E48992F-80FB-7458-8BAF-A7054C73558F}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {0E48992F-80FB-7458-8BAF-A7054C73558F}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {0E48992F-80FB-7458-8BAF-A7054C73558F}.Debug.ActiveCfg = Debug|Win32 - {0E48992F-80FB-7458-8BAF-A7054C73558F}.Debug.Build.0 = Debug|Win32 - {0E48992F-80FB-7458-8BAF-A7054C73558F}.DebugDll.ActiveCfg = DebugDll|Win32 - {0E48992F-80FB-7458-8BAF-A7054C73558F}.DebugDll.Build.0 = DebugDll|Win32 - {0E48992F-80FB-7458-8BAF-A7054C73558F}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {0E48992F-80FB-7458-8BAF-A7054C73558F}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - {A0958CD9-0E39-4A77-3711-9B488F508FBF}.Release.ActiveCfg = Release|Win32 - {A0958CD9-0E39-4A77-3711-9B488F508FBF}.Release.Build.0 = Release|Win32 - {A0958CD9-0E39-4A77-3711-9B488F508FBF}.ReleaseDll.ActiveCfg = ReleaseDll|Win32 - {A0958CD9-0E39-4A77-3711-9B488F508FBF}.ReleaseDll.Build.0 = ReleaseDll|Win32 - {A0958CD9-0E39-4A77-3711-9B488F508FBF}.ReleaseDoublePrecision.ActiveCfg = ReleaseDoublePrecision|Win32 - {A0958CD9-0E39-4A77-3711-9B488F508FBF}.ReleaseDoublePrecision.Build.0 = ReleaseDoublePrecision|Win32 - {A0958CD9-0E39-4A77-3711-9B488F508FBF}.Debug.ActiveCfg = Debug|Win32 - {A0958CD9-0E39-4A77-3711-9B488F508FBF}.Debug.Build.0 = Debug|Win32 - {A0958CD9-0E39-4A77-3711-9B488F508FBF}.DebugDll.ActiveCfg = DebugDll|Win32 - {A0958CD9-0E39-4A77-3711-9B488F508FBF}.DebugDll.Build.0 = DebugDll|Win32 - {A0958CD9-0E39-4A77-3711-9B488F508FBF}.DebugDoublePrecision.ActiveCfg = DebugDoublePrecision|Win32 - {A0958CD9-0E39-4A77-3711-9B488F508FBF}.DebugDoublePrecision.Build.0 = DebugDoublePrecision|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE EndGlobalSection EndGlobal diff --git a/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h b/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h index a53814bb4..7bdc5c9b8 100644 --- a/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h +++ b/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h @@ -69,7 +69,8 @@ CONCAVE_SHAPES_END_HERE, COMPOUND_SHAPE_PROXYTYPE, SOFTBODY_SHAPE_PROXYTYPE, - + HFFLUID_SHAPE_PROXYTYPE, + HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE, INVALID_SHAPE_PROXYTYPE, MAX_BROADPHASE_COLLISION_TYPES diff --git a/src/BulletCollision/CollisionDispatch/btCollisionObject.h b/src/BulletCollision/CollisionDispatch/btCollisionObject.h index fedd69517..4fe361f97 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionObject.h +++ b/src/BulletCollision/CollisionDispatch/btCollisionObject.h @@ -114,10 +114,11 @@ public: { CO_COLLISION_OBJECT =1, CO_RIGID_BODY, - CO_SOFT_BODY, ///CO_GHOST_OBJECT keeps track of all objects overlapping its AABB and that pass its collision filter ///It is useful for collision sensors, explosion objects, character controller etc. - CO_GHOST_OBJECT + CO_GHOST_OBJECT, + CO_SOFT_BODY, + CO_HF_FLUID }; SIMD_FORCE_INLINE bool mergesSimulationIslands() const diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp index 54f17c95b..f31cbc5ba 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp @@ -338,7 +338,8 @@ int btDiscreteDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps, //process some debugging flags if (getDebugDrawer()) { - gDisableDeactivation = (getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_NoDeactivation) != 0; + btIDebugDraw* debugDrawer = getDebugDrawer (); + gDisableDeactivation = (debugDrawer->getDebugMode() & btIDebugDraw::DBG_NoDeactivation) != 0; } if (numSimulationSubSteps) { diff --git a/src/LinearMath/btAlignedAllocator.h b/src/LinearMath/btAlignedAllocator.h index 87487d75e..150dd7ed2 100644 --- a/src/LinearMath/btAlignedAllocator.h +++ b/src/LinearMath/btAlignedAllocator.h @@ -38,7 +38,7 @@ void btAlignedFreeInternal (void* ptr,int line,char* filename); void* btAlignedAllocInternal (size_t size, int alignment); void btAlignedFreeInternal (void* ptr); - #define btAlignedAlloc(a,b) btAlignedAllocInternal(a,b) + #define btAlignedAlloc(size,alignment) btAlignedAllocInternal(size,alignment) #define btAlignedFree(ptr) btAlignedFreeInternal(ptr) #endif diff --git a/src/LinearMath/btIDebugDraw.h b/src/LinearMath/btIDebugDraw.h index 563615a9a..e1cbf9f81 100644 --- a/src/LinearMath/btIDebugDraw.h +++ b/src/LinearMath/btIDebugDraw.h @@ -57,6 +57,19 @@ class btIDebugDraw virtual ~btIDebugDraw() {}; + virtual void drawLine(const btVector3& from,const btVector3& to, const btVector3& fromColor, const btVector3& toColor) + { + drawLine (from, to, fromColor); + } + + virtual void drawBox (const btVector3& boxMin, const btVector3& boxMax, const btVector3& color, btScalar alpha) + { + } + + virtual void drawSphere (const btVector3& p, btScalar radius, const btVector3& color) + { + } + virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color)=0; virtual void drawTriangle(const btVector3& v0,const btVector3& v1,const btVector3& v2,const btVector3& /*n0*/,const btVector3& /*n1*/,const btVector3& /*n2*/,const btVector3& color, btScalar alpha)