added Dev0's GIMPACT test/demo
This commit is contained in:
1379
Demos/GimpactTestDemo/BunnyMesh.h
Normal file
1379
Demos/GimpactTestDemo/BunnyMesh.h
Normal file
File diff suppressed because it is too large
Load Diff
730
Demos/GimpactTestDemo/GimpactTestDemo.cpp
Normal file
730
Demos/GimpactTestDemo/GimpactTestDemo.cpp
Normal file
@@ -0,0 +1,730 @@
|
|||||||
|
/*
|
||||||
|
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 "GimpactTestDemo.h"
|
||||||
|
|
||||||
|
#include "LinearMath/btDefaultMotionState.h"
|
||||||
|
#include "LinearMath/btIDebugDraw.h"
|
||||||
|
#include "LinearMath/btQuickprof.h"
|
||||||
|
#include "LinearMath/btDefaultMotionState.h"
|
||||||
|
|
||||||
|
/// Including GIMPACT here
|
||||||
|
#include "GIMPACT/Bullet/btGImpactShape.h"
|
||||||
|
#include "GIMPACT/Bullet/btGImpactCollisionAlgorithm.h"
|
||||||
|
|
||||||
|
#include "BMF_Api.h"
|
||||||
|
|
||||||
|
#include "GLDebugDrawer.h"
|
||||||
|
|
||||||
|
#include "GL_ShapeDrawer.h"
|
||||||
|
#include "GlutStuff.h"
|
||||||
|
|
||||||
|
/// Include Torus Mesh here
|
||||||
|
#include "TorusMesh.h"
|
||||||
|
#include "BunnyMesh.h"
|
||||||
|
|
||||||
|
GLDebugDrawer debugDrawer;
|
||||||
|
//Real dts = 0.000001f;
|
||||||
|
Real dts = 1.0 / 60.0;
|
||||||
|
|
||||||
|
|
||||||
|
///**************************************************************************************
|
||||||
|
/// GIMPACT Test Demo made by DevO
|
||||||
|
///
|
||||||
|
///**************************************************************************************
|
||||||
|
|
||||||
|
#define TEST_GIMPACT_TORUS
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
///User can override this material combiner by implementing gContactAddedCallback and setting body0->m_collisionFlags |= btCollisionObject::customMaterialCallback;
|
||||||
|
inline btScalar calculateCombinedFriction(float friction0,float friction1)
|
||||||
|
{
|
||||||
|
btScalar friction = friction0 * friction1;
|
||||||
|
|
||||||
|
const btScalar MAX_FRICTION = 10.f;
|
||||||
|
if (friction < -MAX_FRICTION)
|
||||||
|
friction = -MAX_FRICTION;
|
||||||
|
if (friction > MAX_FRICTION)
|
||||||
|
friction = MAX_FRICTION;
|
||||||
|
return friction;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
inline btScalar calculateCombinedRestitution(float restitution0,float restitution1)
|
||||||
|
{
|
||||||
|
return restitution0 * restitution1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1)
|
||||||
|
{
|
||||||
|
|
||||||
|
float friction0 = colObj0->getFriction();
|
||||||
|
float friction1 = colObj1->getFriction();
|
||||||
|
float restitution0 = colObj0->getRestitution();
|
||||||
|
float restitution1 = colObj1->getRestitution();
|
||||||
|
|
||||||
|
if (colObj0->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK)
|
||||||
|
{
|
||||||
|
friction0 = 1.0;//partId0,index0
|
||||||
|
restitution0 = 0.f;
|
||||||
|
}
|
||||||
|
if (colObj1->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK)
|
||||||
|
{
|
||||||
|
if (index1&1)
|
||||||
|
{
|
||||||
|
friction1 = 1.0f;//partId1,index1
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
friction1 = 0.f;
|
||||||
|
}
|
||||||
|
restitution1 = 0.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
cp.m_combinedFriction = calculateCombinedFriction(friction0,friction1);
|
||||||
|
cp.m_combinedRestitution = calculateCombinedRestitution(restitution0,restitution1);
|
||||||
|
|
||||||
|
//this return value is currently ignored, but to be on the safe side: return false if you don't calculate friction
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern ContactAddedCallback gContactAddedCallback;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//################################## main #####################################
|
||||||
|
int main(int argc,char** argv)
|
||||||
|
{
|
||||||
|
gContactAddedCallback = CustomMaterialCombinerCallback;
|
||||||
|
|
||||||
|
GimpactConcaveDemo* concaveDemo = new GimpactConcaveDemo(); /// This will not be Deleted!!!
|
||||||
|
concaveDemo->initPhysics();
|
||||||
|
concaveDemo->setCameraDistance(45.f);
|
||||||
|
|
||||||
|
//cannot run stepFront yet, the OpenGL context is not opened (stepFront updates camera...)
|
||||||
|
// concaveDemo->stepFront();
|
||||||
|
// concaveDemo->stepFront();
|
||||||
|
// concaveDemo->stepFront();
|
||||||
|
// concaveDemo->stepFront();
|
||||||
|
|
||||||
|
return glutmain(argc, argv,640,480,"DevO,s GIMPACT Test Demo",concaveDemo);
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void GimpactConcaveDemo::renderme()
|
||||||
|
{
|
||||||
|
updateCamera();
|
||||||
|
|
||||||
|
|
||||||
|
btScalar m[16];
|
||||||
|
|
||||||
|
if (m_dynamicsWorld)
|
||||||
|
{
|
||||||
|
int numObjects = m_dynamicsWorld->getNumCollisionObjects();
|
||||||
|
btVector3 wireColor(1,0,0);
|
||||||
|
for (int i=0;i<numObjects;i++)
|
||||||
|
{
|
||||||
|
btCollisionObject* colObj = m_dynamicsWorld->getCollisionObjectArray()[i];
|
||||||
|
btRigidBody* body = btRigidBody::upcast(colObj);
|
||||||
|
|
||||||
|
if (body && body->getMotionState())
|
||||||
|
{
|
||||||
|
btDefaultMotionState* myMotionState = (btDefaultMotionState*)body->getMotionState();
|
||||||
|
myMotionState->m_graphicsWorldTrans.getOpenGLMatrix(m);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
colObj->getWorldTransform().getOpenGLMatrix(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
btVector3 wireColor(1.f,1.0f,0.5f); //wants deactivation
|
||||||
|
if (i & 1)
|
||||||
|
{
|
||||||
|
wireColor = btVector3(0.f,0.0f,1.f);
|
||||||
|
}
|
||||||
|
///color differently for active, sleeping, wantsdeactivation states
|
||||||
|
if (colObj->getActivationState() == 1) //active
|
||||||
|
{
|
||||||
|
if (i & 1)
|
||||||
|
{
|
||||||
|
wireColor += btVector3 (0.8f,0.1f,0.1f);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
wireColor += btVector3 (0.5f,0.f,0.f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (colObj->getActivationState() == 2) //ISLAND_SLEEPING
|
||||||
|
{
|
||||||
|
if (i & 1)
|
||||||
|
{
|
||||||
|
wireColor += btVector3 (0.5f,0.8f, 0.5f);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
wireColor += btVector3 (0.f,0.5f,0.f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GL_ShapeDrawer::drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float xOffset = 10.f;
|
||||||
|
float yStart = 20.f;
|
||||||
|
float yIncr = 20.f;
|
||||||
|
char buf[124];
|
||||||
|
|
||||||
|
glColor3f(0, 0, 0);
|
||||||
|
|
||||||
|
setOrthographicProjection();
|
||||||
|
|
||||||
|
glRasterPos3f(xOffset,yStart,0);
|
||||||
|
sprintf(buf,"mouse to interact");
|
||||||
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||||
|
yStart += yIncr;
|
||||||
|
|
||||||
|
/* glRasterPos3f(xOffset,yStart,0);
|
||||||
|
sprintf(buf,"space to reset");
|
||||||
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||||
|
yStart += yIncr;
|
||||||
|
*/
|
||||||
|
glRasterPos3f(xOffset,yStart,0);
|
||||||
|
sprintf(buf,"cursor keys and z,x to navigate");
|
||||||
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||||
|
yStart += yIncr;
|
||||||
|
|
||||||
|
glRasterPos3f(xOffset,yStart,0);
|
||||||
|
sprintf(buf,"i to toggle simulation, s single step");
|
||||||
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||||
|
yStart += yIncr;
|
||||||
|
|
||||||
|
glRasterPos3f(xOffset,yStart,0);
|
||||||
|
sprintf(buf,"q to quit");
|
||||||
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||||
|
yStart += yIncr;
|
||||||
|
|
||||||
|
glRasterPos3f(xOffset,yStart,0);
|
||||||
|
sprintf(buf,". to shoot TRIMESH (dot)");
|
||||||
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||||
|
yStart += yIncr;
|
||||||
|
|
||||||
|
// not yet hooked up again after refactoring...
|
||||||
|
|
||||||
|
/* glRasterPos3f(xOffset,yStart,0);
|
||||||
|
sprintf(buf,"d to toggle deactivation");
|
||||||
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||||
|
yStart += yIncr;
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
glRasterPos3f(xOffset,yStart,0);
|
||||||
|
sprintf(buf,"a to draw temporal AABBs");
|
||||||
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||||
|
yStart += yIncr;
|
||||||
|
*/
|
||||||
|
|
||||||
|
glRasterPos3f(xOffset,yStart,0);
|
||||||
|
sprintf(buf,"h to toggle help text");
|
||||||
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||||
|
yStart += yIncr;
|
||||||
|
|
||||||
|
//bool useBulletLCP = !(getDebugMode() & btIDebugDraw::DBG_DisableBulletLCP);
|
||||||
|
|
||||||
|
bool useCCD = (getDebugMode() & btIDebugDraw::DBG_EnableCCD);
|
||||||
|
|
||||||
|
glRasterPos3f(xOffset,yStart,0);
|
||||||
|
sprintf(buf,"1 CCD mode (adhoc) = %i",useCCD);
|
||||||
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||||
|
yStart += yIncr;
|
||||||
|
|
||||||
|
glRasterPos3f(xOffset,yStart,0);
|
||||||
|
sprintf(buf,"+- shooting speed = %10.2f",m_ShootBoxInitialSpeed);
|
||||||
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||||
|
yStart += yIncr;
|
||||||
|
|
||||||
|
resetPerspectiveProjection();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void GimpactConcaveDemo::initGImpactCollision()
|
||||||
|
{
|
||||||
|
/// Create Torus Shape
|
||||||
|
{
|
||||||
|
m_indexVertexArrays = new btTriangleIndexVertexArray
|
||||||
|
(NUM_TRIANGLES,
|
||||||
|
&gIndices[0][0],
|
||||||
|
3*sizeof(int),
|
||||||
|
NUM_VERTICES,
|
||||||
|
(Real*) &gVertices[0],sizeof(Real)*3);
|
||||||
|
|
||||||
|
btGImpactMeshShape * trimesh = new btGImpactMeshShape(m_indexVertexArrays);
|
||||||
|
trimesh->setLocalScaling(btVector3(1.f,1.f,1.f));
|
||||||
|
trimesh->updateBound();
|
||||||
|
trimesh->setMargin(0.01); ///?????
|
||||||
|
m_trimeshShape = trimesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create Bunny Shape
|
||||||
|
{
|
||||||
|
m_indexVertexArrays2 = new btTriangleIndexVertexArray
|
||||||
|
(BUNNY_NUM_TRIANGLES,
|
||||||
|
&gIndicesBunny[0][0],
|
||||||
|
3*sizeof(int),
|
||||||
|
BUNNY_NUM_VERTICES,
|
||||||
|
(Real*) &gVerticesBunny[0],sizeof(Real)*3);
|
||||||
|
|
||||||
|
btGImpactMeshShape * trimesh2 = new btGImpactMeshShape(m_indexVertexArrays2);
|
||||||
|
trimesh2->setLocalScaling(btVector3(4.f,4.f,4.f));
|
||||||
|
trimesh2->updateBound();
|
||||||
|
trimesh2->setMargin(0.01); ///?????
|
||||||
|
m_trimeshShape2 = trimesh2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///register GIMPACT algorithm
|
||||||
|
btCollisionDispatcher * dispatcher = static_cast<btCollisionDispatcher *>(m_dynamicsWorld ->getDispatcher());
|
||||||
|
{
|
||||||
|
//btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher); /// Register GIMPACT !!!
|
||||||
|
if(!m_gimpactCollisionCreateFunc) m_gimpactCollisionCreateFunc = new btGImpactCollisionAlgorithm::CreateFunc; /// NEW
|
||||||
|
|
||||||
|
for (GUINT i = 0;i < MAX_BROADPHASE_COLLISION_TYPES ;i++ )
|
||||||
|
{
|
||||||
|
m_dispatcher->registerCollisionCreateFunc(GIMPACT_SHAPE_PROXYTYPE,i ,m_gimpactCollisionCreateFunc);
|
||||||
|
}
|
||||||
|
for (GUINT i = 0;i < MAX_BROADPHASE_COLLISION_TYPES ;i++ )
|
||||||
|
{
|
||||||
|
m_dispatcher->registerCollisionCreateFunc(i,GIMPACT_SHAPE_PROXYTYPE ,m_gimpactCollisionCreateFunc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void GimpactConcaveDemo::initPhysics()
|
||||||
|
{
|
||||||
|
/// Init Bullet
|
||||||
|
m_collisionConfiguration = new btDefaultCollisionConfiguration();
|
||||||
|
|
||||||
|
m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration);
|
||||||
|
//btOverlappingPairCache* broadphase = new btSimpleBroadphase();
|
||||||
|
//m_broadphase = new btSimpleBroadphase();
|
||||||
|
|
||||||
|
LONG maxProxies = 1024;
|
||||||
|
btVector3 worldAabbMin(-10000,-10000,-10000);
|
||||||
|
btVector3 worldAabbMax( 10000, 10000, 10000);
|
||||||
|
m_broadphase = new bt32BitAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
|
||||||
|
|
||||||
|
m_constraintSolver = new btSequentialImpulseConstraintSolver();
|
||||||
|
|
||||||
|
m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_constraintSolver);
|
||||||
|
m_dynamicsWorld->setDebugDrawer(&debugDrawer);
|
||||||
|
|
||||||
|
//create trimesh model and shape
|
||||||
|
initGImpactCollision();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// Create Scene
|
||||||
|
float mass = 0.f;
|
||||||
|
btTransform startTransform;
|
||||||
|
startTransform.setIdentity();
|
||||||
|
|
||||||
|
btCollisionShape* staticboxShape1 = new btBoxShape(btVector3(200,1,200));//floor
|
||||||
|
btCollisionShape* staticboxShape2 = new btBoxShape(btVector3(1,50,200));//left wall
|
||||||
|
btCollisionShape* staticboxShape3 = new btBoxShape(btVector3(1,50,200));//right wall
|
||||||
|
btCollisionShape* staticboxShape4 = new btBoxShape(btVector3(200,50,1));//front wall
|
||||||
|
btCollisionShape* staticboxShape5 = new btBoxShape(btVector3(200,50,1));//back wall
|
||||||
|
|
||||||
|
btCompoundShape* staticScenario = new btCompoundShape();//static scenario
|
||||||
|
|
||||||
|
startTransform.setOrigin(btVector3(0,-10,0));
|
||||||
|
staticScenario->addChildShape(startTransform,staticboxShape1);
|
||||||
|
startTransform.setOrigin(btVector3(-200,15,0));
|
||||||
|
staticScenario->addChildShape(startTransform,staticboxShape2);
|
||||||
|
startTransform.setOrigin(btVector3(200,15,0));
|
||||||
|
staticScenario->addChildShape(startTransform,staticboxShape3);
|
||||||
|
startTransform.setOrigin(btVector3(0,15,200));
|
||||||
|
staticScenario->addChildShape(startTransform,staticboxShape4);
|
||||||
|
startTransform.setOrigin(btVector3(0,15,-200));
|
||||||
|
staticScenario->addChildShape(startTransform,staticboxShape5);
|
||||||
|
|
||||||
|
startTransform.setOrigin(btVector3(0,-10,0));
|
||||||
|
|
||||||
|
btRigidBody* staticBody = localCreateRigidBody(mass, startTransform,staticScenario);
|
||||||
|
|
||||||
|
staticBody->setCollisionFlags(staticBody->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT);
|
||||||
|
staticBody->setActivationState(ISLAND_SLEEPING);
|
||||||
|
|
||||||
|
//enable custom material callback
|
||||||
|
staticBody->setCollisionFlags(staticBody->getCollisionFlags()|btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
|
||||||
|
|
||||||
|
|
||||||
|
//static plane
|
||||||
|
/*
|
||||||
|
btVector3 normal(0.4,1.5,-0.4);
|
||||||
|
normal.normalize();
|
||||||
|
btCollisionShape* staticplaneShape6 = new btStaticPlaneShape(normal,0.0);// A plane
|
||||||
|
|
||||||
|
startTransform.setOrigin(btVector3(0,-20,0));
|
||||||
|
|
||||||
|
btRigidBody* staticBody2 = localCreateRigidBody(mass, startTransform,staticplaneShape6 );
|
||||||
|
|
||||||
|
staticBody2->setCollisionFlags(staticBody2->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT);
|
||||||
|
staticBody2->setActivationState(ISLAND_SLEEPING);
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/// Create Static Torus
|
||||||
|
float height = 32;
|
||||||
|
float step = 2.5;
|
||||||
|
float massT = 1.0;
|
||||||
|
|
||||||
|
startTransform.setOrigin(btVector3(0,height,-5));
|
||||||
|
startTransform.setRotation(btQuaternion(3.14159265*0.5,0,3.14159265*0.5));
|
||||||
|
kinematicTorus = localCreateRigidBody(0.0, startTransform,m_trimeshShape);
|
||||||
|
//kinematicTorus->setCollisionFlags(kinematicTorus->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT);
|
||||||
|
//kinematicTorus->setActivationState(ISLAND_SLEEPING);
|
||||||
|
|
||||||
|
kinematicTorus->setCollisionFlags( kinematicTorus->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
|
||||||
|
kinematicTorus->setActivationState(DISABLE_DEACTIVATION);
|
||||||
|
|
||||||
|
/// Kinematic
|
||||||
|
kinTorusTran = btVector3(-0.1,0,0);
|
||||||
|
kinTorusRot = btQuaternion(0,3.14159265*0.01,0);
|
||||||
|
|
||||||
|
#ifdef TEST_GIMPACT_TORUS
|
||||||
|
|
||||||
|
/// Create dynamic Torus
|
||||||
|
for (int i=0;i<8;i++)
|
||||||
|
{
|
||||||
|
height -= step;
|
||||||
|
startTransform.setOrigin(btVector3(0,height,-5));
|
||||||
|
startTransform.setRotation(btQuaternion(0,0,3.14159265*0.5));
|
||||||
|
btRigidBody* bodyA = localCreateRigidBody(massT, startTransform,m_trimeshShape);
|
||||||
|
|
||||||
|
height -= step;
|
||||||
|
startTransform.setOrigin(btVector3(0,height,-5));
|
||||||
|
startTransform.setRotation(btQuaternion(3.14159265*0.5,0,3.14159265*0.5));
|
||||||
|
btRigidBody* bodyB = localCreateRigidBody(massT, startTransform,m_trimeshShape);
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
startTransform.setIdentity();
|
||||||
|
|
||||||
|
|
||||||
|
/// Create Dynamic Boxes
|
||||||
|
{
|
||||||
|
for (int i=0;i<9;i++)
|
||||||
|
{
|
||||||
|
btCollisionShape* boxShape = new btBoxShape(btVector3(1,1,1));
|
||||||
|
startTransform.setOrigin(btVector3(2*i-5,2,-3));
|
||||||
|
localCreateRigidBody(1, startTransform,boxShape);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//m_debugMode |= btIDebugDraw::DBG_DrawWireframe;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void GimpactConcaveDemo::shootTrimesh(const btVector3& destination)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (m_dynamicsWorld)
|
||||||
|
{
|
||||||
|
float mass = 4.f;
|
||||||
|
btTransform startTransform;
|
||||||
|
startTransform.setIdentity();
|
||||||
|
btVector3 camPos = getCameraPosition();
|
||||||
|
startTransform.setOrigin(camPos);
|
||||||
|
|
||||||
|
btRigidBody* body = this->localCreateRigidBody(mass, startTransform,m_trimeshShape2);
|
||||||
|
|
||||||
|
btVector3 linVel(destination[0]-camPos[0],destination[1]-camPos[1],destination[2]-camPos[2]);
|
||||||
|
linVel.normalize();
|
||||||
|
linVel*=m_ShootBoxInitialSpeed*0.25;
|
||||||
|
|
||||||
|
body->getWorldTransform().setOrigin(camPos);
|
||||||
|
body->getWorldTransform().setRotation(btQuaternion(0,0,0,1));
|
||||||
|
body->setLinearVelocity(linVel);
|
||||||
|
body->setAngularVelocity(btVector3(0,0,0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void GimpactConcaveDemo::clientMoveAndDisplay()
|
||||||
|
{
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
#define USE_KINEMATIC_GROUND
|
||||||
|
#ifdef USE_KINEMATIC_GROUND
|
||||||
|
//kinTorusTran = btVector3(-0.05,0,0);
|
||||||
|
//kinTorusRot = btQuaternion(0,3.14159265*0.1,0);
|
||||||
|
|
||||||
|
//kinematic object
|
||||||
|
btCollisionObject* colObj = kinematicTorus;
|
||||||
|
//is this a rigidbody with a motionstate? then use the motionstate to update positions!
|
||||||
|
if (btRigidBody::upcast(colObj) && btRigidBody::upcast(colObj)->getMotionState())
|
||||||
|
{
|
||||||
|
btTransform newTrans;
|
||||||
|
btRigidBody::upcast(colObj)->getMotionState()->getWorldTransform(newTrans);
|
||||||
|
|
||||||
|
newTrans.getOrigin() += kinTorusTran;
|
||||||
|
newTrans.getBasis() = newTrans.getBasis() * btMatrix3x3(kinTorusRot);
|
||||||
|
if(newTrans.getOrigin().getX() > 6.0){
|
||||||
|
newTrans.getOrigin().setX(6.0);
|
||||||
|
kinTorusTran = -kinTorusTran;
|
||||||
|
}
|
||||||
|
if(newTrans.getOrigin().getX() < -6.0){
|
||||||
|
newTrans.getOrigin().setX(-6.0);
|
||||||
|
kinTorusTran = -kinTorusTran;
|
||||||
|
}
|
||||||
|
|
||||||
|
btRigidBody::upcast(colObj)->getMotionState()->setWorldTransform(newTrans);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
btTransform &newTrans = m_dynamicsWorld->getCollisionObjectArray()[0]->getWorldTransform();
|
||||||
|
newTrans.getOrigin() += kinTorusTran;
|
||||||
|
if(newTrans.getOrigin().getX() > 0.1) kinTorusTran = -kinTorusTran;
|
||||||
|
if(newTrans.getOrigin().getX() < 0.1) kinTorusTran = -kinTorusTran;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //USE_KINEMATIC_GROUND
|
||||||
|
|
||||||
|
unsigned long int time = m_clock.getTimeMilliseconds();
|
||||||
|
//float dt = float(m_clock.getTimeMicroseconds()) * dts; //0.000001f;
|
||||||
|
float dt = float(m_clock.getTimeMicroseconds()) * 0.000001f;
|
||||||
|
|
||||||
|
printf("%i time %i ms \n",m_steps_done,time);
|
||||||
|
|
||||||
|
m_clock.reset();
|
||||||
|
m_dynamicsWorld->stepSimulation(dt);
|
||||||
|
m_steps_done++;
|
||||||
|
|
||||||
|
//m_dynamicsWorld->stepSimulation(dts);
|
||||||
|
|
||||||
|
renderme();
|
||||||
|
|
||||||
|
glFlush();
|
||||||
|
glutSwapBuffers();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void GimpactConcaveDemo::displayCallback(void) {
|
||||||
|
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
renderme();
|
||||||
|
|
||||||
|
glFlush();
|
||||||
|
glutSwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void GimpactConcaveDemo::clientResetScene()
|
||||||
|
{
|
||||||
|
m_steps_done = 0;
|
||||||
|
DemoApplication::clientResetScene();
|
||||||
|
}
|
||||||
|
|
||||||
|
#define KEY_ESCAPE 0x1B
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void GimpactConcaveDemo::keyboardCallback(unsigned char key, int x, int y)
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case '.':
|
||||||
|
{
|
||||||
|
shootTrimesh(getCameraTargetPosition());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case '2':
|
||||||
|
{
|
||||||
|
dts += 0.000001f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case '3':
|
||||||
|
{
|
||||||
|
dts -= 0.000001f; if(dts<0.000001f) dts = 0.000001f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
DemoApplication::keyboardCallback(key, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void GimpactConcaveDemo::keyboardCallback(unsigned char key, int x, int y)
|
||||||
|
{
|
||||||
|
m_lastKey = 0;
|
||||||
|
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case 'q' :
|
||||||
|
case KEY_ESCAPE :
|
||||||
|
exit(0); break;
|
||||||
|
|
||||||
|
|
||||||
|
//GLUT_KEY_LEFT
|
||||||
|
case 'l' : stepLeft(); break;
|
||||||
|
case 'r' : stepRight(); break;
|
||||||
|
case 'f' : stepFront(); break;
|
||||||
|
case 'b' : stepBack(); break;
|
||||||
|
case 'z' : zoomIn(); break;
|
||||||
|
case 'x' : zoomOut(); break;
|
||||||
|
case 'i' : toggleIdle(); break;
|
||||||
|
case 'h':
|
||||||
|
if (m_debugMode & btIDebugDraw::DBG_NoHelpText)
|
||||||
|
m_debugMode = m_debugMode & (~btIDebugDraw::DBG_NoHelpText);
|
||||||
|
else
|
||||||
|
m_debugMode |= btIDebugDraw::DBG_NoHelpText;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'w':
|
||||||
|
if (m_debugMode & btIDebugDraw::DBG_DrawWireframe)
|
||||||
|
m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawWireframe);
|
||||||
|
else
|
||||||
|
m_debugMode |= btIDebugDraw::DBG_DrawWireframe;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'p':
|
||||||
|
if (m_debugMode & btIDebugDraw::DBG_ProfileTimings)
|
||||||
|
m_debugMode = m_debugMode & (~btIDebugDraw::DBG_ProfileTimings);
|
||||||
|
else
|
||||||
|
m_debugMode |= btIDebugDraw::DBG_ProfileTimings;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'm':
|
||||||
|
if (m_debugMode & btIDebugDraw::DBG_EnableSatComparison)
|
||||||
|
m_debugMode = m_debugMode & (~btIDebugDraw::DBG_EnableSatComparison);
|
||||||
|
else
|
||||||
|
m_debugMode |= btIDebugDraw::DBG_EnableSatComparison;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'n':
|
||||||
|
if (m_debugMode & btIDebugDraw::DBG_DisableBulletLCP)
|
||||||
|
m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DisableBulletLCP);
|
||||||
|
else
|
||||||
|
m_debugMode |= btIDebugDraw::DBG_DisableBulletLCP;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 't' :
|
||||||
|
if (m_debugMode & btIDebugDraw::DBG_DrawText)
|
||||||
|
m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawText);
|
||||||
|
else
|
||||||
|
m_debugMode |= btIDebugDraw::DBG_DrawText;
|
||||||
|
break;
|
||||||
|
case 'y':
|
||||||
|
if (m_debugMode & btIDebugDraw::DBG_DrawFeaturesText)
|
||||||
|
m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawFeaturesText);
|
||||||
|
else
|
||||||
|
m_debugMode |= btIDebugDraw::DBG_DrawFeaturesText;
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
if (m_debugMode & btIDebugDraw::DBG_DrawAabb){
|
||||||
|
m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawAabb);
|
||||||
|
//printf("Not Draw AABB \n");
|
||||||
|
}else{
|
||||||
|
m_debugMode |= btIDebugDraw::DBG_DrawAabb;
|
||||||
|
//printf("Draw AABB \n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'c' :
|
||||||
|
if (m_debugMode & btIDebugDraw::DBG_DrawContactPoints)
|
||||||
|
m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawContactPoints);
|
||||||
|
else
|
||||||
|
m_debugMode |= btIDebugDraw::DBG_DrawContactPoints;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'd' :
|
||||||
|
if (m_debugMode & btIDebugDraw::DBG_NoDeactivation)
|
||||||
|
m_debugMode = m_debugMode & (~btIDebugDraw::DBG_NoDeactivation);
|
||||||
|
else
|
||||||
|
m_debugMode |= btIDebugDraw::DBG_NoDeactivation;
|
||||||
|
if (m_debugMode | btIDebugDraw::DBG_NoDeactivation)
|
||||||
|
{
|
||||||
|
gDisableDeactivation = true;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
gDisableDeactivation = false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
case 'o' :
|
||||||
|
{
|
||||||
|
m_stepping = !m_stepping;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 's' : clientMoveAndDisplay(); break;
|
||||||
|
// case ' ' : newRandom(); break;
|
||||||
|
case ' ':
|
||||||
|
clientResetScene();
|
||||||
|
break;
|
||||||
|
case '1':
|
||||||
|
{
|
||||||
|
if (m_debugMode & btIDebugDraw::DBG_EnableCCD)
|
||||||
|
m_debugMode = m_debugMode & (~btIDebugDraw::DBG_EnableCCD);
|
||||||
|
else
|
||||||
|
m_debugMode |= btIDebugDraw::DBG_EnableCCD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case '.':
|
||||||
|
{
|
||||||
|
shootTrimesh(getCameraTargetPosition());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case '+':
|
||||||
|
{
|
||||||
|
m_ShootBoxInitialSpeed += 10.f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case '-':
|
||||||
|
{
|
||||||
|
m_ShootBoxInitialSpeed -= 10.f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
// std::cout << "unused key : " << key << std::endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getDynamicsWorld() && getDynamicsWorld()->getDebugDrawer())
|
||||||
|
getDynamicsWorld()->getDebugDrawer()->setDebugMode(m_debugMode);
|
||||||
|
|
||||||
|
glutPostRedisplay();
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
99
Demos/GimpactTestDemo/GimpactTestDemo.h
Normal file
99
Demos/GimpactTestDemo/GimpactTestDemo.h
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
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 TEST_CONCAVE_DEMO_H
|
||||||
|
#define TEST_CONCAVE_DEMO_H
|
||||||
|
|
||||||
|
#include "DemoApplication.h"
|
||||||
|
|
||||||
|
struct btCollisionAlgorithmCreateFunc;
|
||||||
|
|
||||||
|
///GimpactConcaveDemo shows usage of static concave triangle meshes
|
||||||
|
///It also shows per-triangle material (friction/restitution) through CustomMaterialCombinerCallback
|
||||||
|
class GimpactConcaveDemo : public DemoApplication
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
GimpactConcaveDemo()
|
||||||
|
: m_trimeshShape(NULL),
|
||||||
|
m_trimeshShape2(NULL),
|
||||||
|
m_indexVertexArrays(NULL),
|
||||||
|
m_indexVertexArrays2(NULL),
|
||||||
|
m_collisionConfiguration(NULL),
|
||||||
|
m_dispatcher(NULL),
|
||||||
|
m_broadphase(NULL),
|
||||||
|
m_constraintSolver(NULL),
|
||||||
|
m_gimpactCollisionCreateFunc(NULL),
|
||||||
|
m_steps_done(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~GimpactConcaveDemo()
|
||||||
|
{
|
||||||
|
delete m_indexVertexArrays;
|
||||||
|
delete m_trimeshShape;
|
||||||
|
|
||||||
|
delete m_indexVertexArrays2;
|
||||||
|
delete m_trimeshShape2;
|
||||||
|
|
||||||
|
delete m_gimpactCollisionCreateFunc;
|
||||||
|
|
||||||
|
delete m_collisionConfiguration;
|
||||||
|
delete m_dispatcher;
|
||||||
|
delete m_broadphase;
|
||||||
|
delete m_constraintSolver;
|
||||||
|
|
||||||
|
delete m_dynamicsWorld;
|
||||||
|
}
|
||||||
|
|
||||||
|
void initGImpactCollision();
|
||||||
|
void initPhysics();
|
||||||
|
|
||||||
|
virtual void clientMoveAndDisplay();
|
||||||
|
|
||||||
|
virtual void displayCallback();
|
||||||
|
|
||||||
|
virtual void clientResetScene();
|
||||||
|
|
||||||
|
virtual void renderme();
|
||||||
|
virtual void keyboardCallback(unsigned char key, int x, int y);
|
||||||
|
|
||||||
|
///Demo functions
|
||||||
|
void shootTrimesh(const btVector3& destination);
|
||||||
|
|
||||||
|
public: ///data
|
||||||
|
unsigned int m_steps_done;
|
||||||
|
|
||||||
|
btCollisionShape *m_trimeshShape;
|
||||||
|
btCollisionShape *m_trimeshShape2;
|
||||||
|
|
||||||
|
|
||||||
|
btTriangleIndexVertexArray *m_indexVertexArrays;
|
||||||
|
btTriangleIndexVertexArray *m_indexVertexArrays2;
|
||||||
|
|
||||||
|
btVector3 kinTorusTran;
|
||||||
|
btQuaternion kinTorusRot;
|
||||||
|
btRigidBody *kinematicTorus;
|
||||||
|
|
||||||
|
|
||||||
|
btCollisionAlgorithmCreateFunc* m_gimpactCollisionCreateFunc;
|
||||||
|
|
||||||
|
btDefaultCollisionConfiguration* m_collisionConfiguration;
|
||||||
|
btCollisionDispatcher* m_dispatcher;
|
||||||
|
btBroadphaseInterface* m_broadphase;
|
||||||
|
btConstraintSolver* m_constraintSolver;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //CONCAVE_DEMO_H
|
||||||
|
|
||||||
921
Demos/GimpactTestDemo/TorusMesh.h
Normal file
921
Demos/GimpactTestDemo/TorusMesh.h
Normal file
@@ -0,0 +1,921 @@
|
|||||||
|
#ifndef TORUS_MESH_H_
|
||||||
|
#define TORUS_MESH_H_
|
||||||
|
|
||||||
|
|
||||||
|
//*************************** NOT REALLY FAMOUS TORUS ********************************************//
|
||||||
|
|
||||||
|
#define Real btScalar
|
||||||
|
const int NUM_TRIANGLES =600;
|
||||||
|
const int NUM_VERTICES = 300;
|
||||||
|
const int NUM_INDICES = NUM_TRIANGLES * 3;
|
||||||
|
|
||||||
|
|
||||||
|
Real gVertices[NUM_VERTICES * 3] = {
|
||||||
|
Real(2.5), Real(0), Real(0),
|
||||||
|
Real(2.405), Real(0.294), Real(0),
|
||||||
|
Real(2.155), Real(0.476), Real(0),
|
||||||
|
Real(1.845), Real(0.476), Real(0),
|
||||||
|
Real(1.595), Real(0.294), Real(0),
|
||||||
|
Real(1.5), Real(0 ), Real(0),
|
||||||
|
Real(1.595), Real(-0.294), Real(0),
|
||||||
|
Real(1.845), Real(-0.476), Real(0),
|
||||||
|
Real(2.155), Real(-0.476), Real(0),
|
||||||
|
Real(2.405), Real(-0.294), Real(0),
|
||||||
|
Real(2.445), Real(0 ), Real(0.52 ),
|
||||||
|
Real(2.352), Real(0.294), Real(0.5 ),
|
||||||
|
Real(2.107), Real(0.476), Real(0.448),
|
||||||
|
Real(1.805), Real(0.476), Real(0.384),
|
||||||
|
Real(1.561), Real(0.294), Real(0.332),
|
||||||
|
Real(1.467), Real(0 ), Real(0.312),
|
||||||
|
Real(1.561), Real(-0.294), Real(0.332),
|
||||||
|
Real(1.805), Real(-0.476), Real(0.384),
|
||||||
|
Real(2.107), Real(-0.476), Real(0.448),
|
||||||
|
Real(2.352), Real(-0.294), Real(0.5 ),
|
||||||
|
Real(2.284), Real(0), Real(1.017),
|
||||||
|
Real(2.197), Real(0.294), Real(0.978),
|
||||||
|
Real(1.968), Real(0.476), Real(0.876),
|
||||||
|
Real(1.686), Real(0.476), Real(0.751),
|
||||||
|
Real(1.458), Real(0.294), Real(0.649),
|
||||||
|
Real(1.37), Real(0), Real(0.61 ),
|
||||||
|
Real(1.458), Real(-0.294), Real(0.649),
|
||||||
|
Real(1.686), Real(-0.476), Real(0.751),
|
||||||
|
Real(1.968), Real(-0.476), Real(0.876),
|
||||||
|
Real(2.197), Real(-0.294), Real(0.978),
|
||||||
|
Real(2.023), Real(0), Real(1.469),
|
||||||
|
Real(1.945), Real(0.294), Real(1.413),
|
||||||
|
Real(1.743), Real(0.476), Real(1.266),
|
||||||
|
Real(1.493), Real(0.476), Real(1.085),
|
||||||
|
Real(1.291), Real(0.294), Real(0.938),
|
||||||
|
Real(1.214), Real(0), Real(0.882),
|
||||||
|
Real(1.291), Real(-0.294), Real(0.938),
|
||||||
|
Real(1.493), Real(-0.476), Real(1.085),
|
||||||
|
Real(1.743), Real(-0.476), Real(1.266),
|
||||||
|
Real(1.945), Real(-0.294), Real(1.413),
|
||||||
|
Real(1.673), Real(0), Real(1.858),
|
||||||
|
Real(1.609), Real(0.294), Real(1.787),
|
||||||
|
Real(1.442), Real(0.476), Real(1.601),
|
||||||
|
Real(1.235), Real(0.476), Real(1.371),
|
||||||
|
Real(1.068), Real(0.294), Real(1.186),
|
||||||
|
Real(1.004), Real(0), Real(1.115),
|
||||||
|
Real(1.068), Real(-0.294), Real(1.186),
|
||||||
|
Real(1.235), Real(-0.476), Real(1.371),
|
||||||
|
Real(1.442), Real(-0.476), Real(1.601),
|
||||||
|
Real(1.609), Real(-0.294), Real(1.787),
|
||||||
|
Real(1.25), Real(0), Real(2.165),
|
||||||
|
Real(1.202), Real(0.294), Real(2.082),
|
||||||
|
Real(1.077), Real(0.476), Real(1.866),
|
||||||
|
Real(0.923), Real(0.476), Real(1.598),
|
||||||
|
Real(0.798), Real(0.294), Real(1.382),
|
||||||
|
Real(0.75), Real(0), Real(1.299),
|
||||||
|
Real(0.798), Real(-0.294), Real(1.382),
|
||||||
|
Real(0.923), Real(-0.476), Real(1.598),
|
||||||
|
Real(1.077), Real(-0.476), Real(1.866),
|
||||||
|
Real(1.202), Real(-0.294), Real(2.082),
|
||||||
|
Real(0.773), Real(0), Real(2.378),
|
||||||
|
Real(0.743), Real(0.294), Real(2.287),
|
||||||
|
Real(0.666), Real(0.476), Real(2.049),
|
||||||
|
Real(0.57), Real(0.476), Real(1.755),
|
||||||
|
Real(0.493), Real(0.294), Real(1.517),
|
||||||
|
Real(0.464), Real(0), Real(1.427),
|
||||||
|
Real(0.493), Real(-0.294), Real(1.517),
|
||||||
|
Real(0.57), Real(-0.476), Real(1.755),
|
||||||
|
Real(0.666), Real(-0.476), Real(2.049),
|
||||||
|
Real(0.743), Real(-0.294), Real(2.287),
|
||||||
|
Real(0.261), Real(0), Real(2.486),
|
||||||
|
Real(0.251), Real(0.294), Real(2.391),
|
||||||
|
Real(0.225), Real(0.476), Real(2.143),
|
||||||
|
Real(0.193), Real(0.476), Real(1.835),
|
||||||
|
Real(0.167), Real(0.294), Real(1.587),
|
||||||
|
Real(0.157), Real(0), Real(1.492),
|
||||||
|
Real(0.167), Real(-0.294), Real(1.587),
|
||||||
|
Real(0.193), Real(-0.476), Real(1.835),
|
||||||
|
Real(0.225), Real(-0.476), Real(2.143),
|
||||||
|
Real(0.251), Real(-0.294), Real(2.391),
|
||||||
|
Real(-0.261), Real(0), Real(2.486),
|
||||||
|
Real(-0.251), Real(0.294), Real(2.391),
|
||||||
|
Real(-0.225), Real(0.476), Real(2.143),
|
||||||
|
Real(-0.193), Real(0.476), Real(1.835),
|
||||||
|
Real(-0.167), Real(0.294), Real(1.587),
|
||||||
|
Real(-0.157), Real(0), Real(1.492),
|
||||||
|
Real(-0.167), Real(-0.294), Real(1.587),
|
||||||
|
Real(-0.193), Real(-0.476), Real(1.835),
|
||||||
|
Real(-0.225), Real(-0.476), Real(2.143),
|
||||||
|
Real(-0.251), Real(-0.294), Real(2.391),
|
||||||
|
Real(-0.773), Real(0), Real(2.378),
|
||||||
|
Real(-0.743), Real(0.294), Real(2.287),
|
||||||
|
Real(-0.666), Real(0.476), Real(2.049),
|
||||||
|
Real(-0.57), Real(0.476), Real(1.755),
|
||||||
|
Real(-0.493), Real(0.294), Real(1.517),
|
||||||
|
Real(-0.464), Real(0), Real(1.427),
|
||||||
|
Real(-0.493), Real(-0.294), Real(1.517),
|
||||||
|
Real(-0.57), Real(-0.476), Real(1.755),
|
||||||
|
Real(-0.666), Real(-0.476), Real(2.049),
|
||||||
|
Real(-0.743), Real(-0.294), Real(2.287),
|
||||||
|
Real(-1.25 ), Real(0), Real(2.165),
|
||||||
|
Real(-1.202), Real(0.294), Real(2.082),
|
||||||
|
Real(-1.077), Real(0.476), Real(1.866),
|
||||||
|
Real(-0.923), Real(0.476), Real(1.598),
|
||||||
|
Real(-0.798), Real(0.294), Real(1.382),
|
||||||
|
Real(-0.75), Real(0), Real(1.299),
|
||||||
|
Real(-0.798), Real(-0.294), Real(1.382),
|
||||||
|
Real(-0.923), Real(-0.476), Real(1.598),
|
||||||
|
Real(-1.077), Real(-0.476), Real(1.866),
|
||||||
|
Real(-1.202), Real(-0.294), Real(2.082),
|
||||||
|
Real(-1.673), Real(0), Real(1.858),
|
||||||
|
Real(-1.609), Real(0.294), Real(1.787),
|
||||||
|
Real(-1.442), Real(0.476), Real(1.601),
|
||||||
|
Real(-1.235), Real(0.476), Real(1.371),
|
||||||
|
Real(-1.068), Real(0.294), Real(1.186),
|
||||||
|
Real(-1.004), Real(0), Real(1.115),
|
||||||
|
Real(-1.068), Real(-0.294), Real(1.186),
|
||||||
|
Real(-1.235), Real(-0.476), Real(1.371),
|
||||||
|
Real(-1.442), Real(-0.476), Real(1.601),
|
||||||
|
Real(-1.609), Real(-0.294), Real(1.787),
|
||||||
|
Real(-2.023), Real(0), Real(1.469),
|
||||||
|
Real(-1.945), Real(0.294), Real(1.413),
|
||||||
|
Real(-1.743), Real(0.476), Real(1.266),
|
||||||
|
Real(-1.493), Real(0.476), Real(1.085),
|
||||||
|
Real(-1.291), Real(0.294), Real(0.938),
|
||||||
|
Real(-1.214), Real(0), Real(0.882),
|
||||||
|
Real(-1.291), Real(-0.294), Real(0.938),
|
||||||
|
Real(-1.493), Real(-0.476), Real(1.085),
|
||||||
|
Real(-1.743), Real(-0.476), Real(1.266),
|
||||||
|
Real(-1.945), Real(-0.294), Real(1.413),
|
||||||
|
Real(-2.284), Real(0), Real(1.017),
|
||||||
|
Real(-2.197), Real(0.294), Real(0.978),
|
||||||
|
Real(-1.968), Real(0.476), Real(0.876),
|
||||||
|
Real(-1.686), Real(0.476), Real(0.751),
|
||||||
|
Real(-1.458), Real(0.294), Real(0.649),
|
||||||
|
Real(-1.37), Real(0), Real(0.61 ),
|
||||||
|
Real(-1.458), Real(-0.294), Real(0.649),
|
||||||
|
Real(-1.686), Real(-0.476), Real(0.751),
|
||||||
|
Real(-1.968), Real(-0.476), Real(0.876),
|
||||||
|
Real(-2.197), Real(-0.294), Real(0.978),
|
||||||
|
Real(-2.445), Real(0), Real(0.52),
|
||||||
|
Real(-2.352), Real(0.294), Real(0.5),
|
||||||
|
Real(-2.107), Real(0.476), Real(0.448),
|
||||||
|
Real(-1.805), Real(0.476), Real(0.384),
|
||||||
|
Real(-1.561), Real(0.294), Real(0.332),
|
||||||
|
Real(-1.467), Real(0), Real(0.312),
|
||||||
|
Real(-1.561), Real(-0.294), Real(0.332),
|
||||||
|
Real(-1.805), Real(-0.476), Real(0.384),
|
||||||
|
Real(-2.107), Real(-0.476), Real(0.448),
|
||||||
|
Real(-2.352), Real(-0.294), Real(0.5),
|
||||||
|
Real(-2.5 ), Real(0), Real(0),
|
||||||
|
Real(-2.405), Real(0.294), Real(0),
|
||||||
|
Real(-2.155), Real(0.476), Real(0),
|
||||||
|
Real(-1.845), Real(0.476), Real(0),
|
||||||
|
Real(-1.595), Real(0.294), Real(0),
|
||||||
|
Real(-1.5), Real(0), Real(0),
|
||||||
|
Real(-1.595), Real(-0.294), Real(0),
|
||||||
|
Real(-1.845), Real(-0.476), Real(0),
|
||||||
|
Real(-2.155), Real(-0.476), Real(0),
|
||||||
|
Real(-2.405), Real(-0.294), Real(0),
|
||||||
|
Real(-2.445), Real(0), Real(-0.52),
|
||||||
|
Real(-2.352), Real(0.294), Real(-0.5),
|
||||||
|
Real(-2.107), Real(0.476), Real(-0.448),
|
||||||
|
Real(-1.805), Real(0.476), Real(-0.384),
|
||||||
|
Real(-1.561), Real(0.294), Real(-0.332),
|
||||||
|
Real(-1.467), Real(0), Real(-0.312),
|
||||||
|
Real(-1.561), Real(-0.294), Real(-0.332),
|
||||||
|
Real(-1.805), Real(-0.476), Real(-0.384),
|
||||||
|
Real(-2.107), Real(-0.476), Real(-0.448),
|
||||||
|
Real(-2.352), Real(-0.294), Real(-0.5),
|
||||||
|
Real(-2.284), Real(0), Real(-1.017),
|
||||||
|
Real(-2.197), Real(0.294), Real(-0.978),
|
||||||
|
Real(-1.968), Real(0.476), Real(-0.876),
|
||||||
|
Real(-1.686), Real(0.476), Real(-0.751),
|
||||||
|
Real(-1.458), Real(0.294), Real(-0.649),
|
||||||
|
Real(-1.37), Real(0), Real(-0.61),
|
||||||
|
Real(-1.458), Real(-0.294), Real(-0.649),
|
||||||
|
Real(-1.686), Real(-0.476), Real(-0.751),
|
||||||
|
Real(-1.968), Real(-0.476), Real(-0.876),
|
||||||
|
Real(-2.197), Real(-0.294), Real(-0.978),
|
||||||
|
Real(-2.023), Real(0), Real(-1.469),
|
||||||
|
Real(-1.945), Real(0.294), Real(-1.413),
|
||||||
|
Real(-1.743), Real(0.476), Real(-1.266),
|
||||||
|
Real(-1.493), Real(0.476), Real(-1.085),
|
||||||
|
Real(-1.291), Real(0.294), Real(-0.938),
|
||||||
|
Real(-1.214), Real(0), Real(-0.882),
|
||||||
|
Real(-1.291), Real(-0.294), Real(-0.938),
|
||||||
|
Real(-1.493), Real(-0.476), Real(-1.085),
|
||||||
|
Real(-1.743), Real(-0.476), Real(-1.266),
|
||||||
|
Real(-1.945), Real(-0.294), Real(-1.413),
|
||||||
|
Real(-1.673), Real(0), Real(-1.858),
|
||||||
|
Real(-1.609), Real(0.294), Real(-1.787),
|
||||||
|
Real(-1.442), Real(0.476), Real(-1.601),
|
||||||
|
Real(-1.235), Real(0.476), Real(-1.371),
|
||||||
|
Real(-1.068), Real(0.294), Real(-1.186),
|
||||||
|
Real(-1.004), Real(0), Real(-1.115),
|
||||||
|
Real(-1.068), Real(-0.294), Real(-1.186),
|
||||||
|
Real(-1.235), Real(-0.476), Real(-1.371),
|
||||||
|
Real(-1.442), Real(-0.476), Real(-1.601),
|
||||||
|
Real(-1.609), Real(-0.294), Real(-1.787),
|
||||||
|
Real(-1.25 ), Real(0), Real(-2.165),
|
||||||
|
Real(-1.202), Real(0.294), Real(-2.082),
|
||||||
|
Real(-1.077), Real(0.476), Real(-1.866),
|
||||||
|
Real(-0.923), Real(0.476), Real(-1.598),
|
||||||
|
Real(-0.798), Real(0.294), Real(-1.382),
|
||||||
|
Real(-0.75), Real(0), Real(-1.299),
|
||||||
|
Real(-0.798), Real(-0.294), Real(-1.382),
|
||||||
|
Real(-0.923), Real(-0.476), Real(-1.598),
|
||||||
|
Real(-1.077), Real(-0.476), Real(-1.866),
|
||||||
|
Real(-1.202), Real(-0.294), Real(-2.082),
|
||||||
|
Real(-0.773), Real(0), Real(-2.378),
|
||||||
|
Real(-0.743), Real(0.294), Real(-2.287),
|
||||||
|
Real(-0.666), Real(0.476), Real(-2.049),
|
||||||
|
Real(-0.57), Real(0.476), Real(-1.755),
|
||||||
|
Real(-0.493), Real(0.294), Real(-1.517),
|
||||||
|
Real(-0.464), Real(0), Real(-1.427),
|
||||||
|
Real(-0.493), Real(-0.294), Real(-1.517),
|
||||||
|
Real(-0.57), Real(-0.476), Real(-1.755),
|
||||||
|
Real(-0.666), Real(-0.476), Real(-2.049),
|
||||||
|
Real(-0.743), Real(-0.294), Real(-2.287),
|
||||||
|
Real(-0.261), Real(0), Real(-2.486),
|
||||||
|
Real(-0.251), Real(0.294), Real(-2.391),
|
||||||
|
Real(-0.225), Real(0.476), Real(-2.143),
|
||||||
|
Real(-0.193), Real(0.476), Real(-1.835),
|
||||||
|
Real(-0.167), Real(0.294), Real(-1.587),
|
||||||
|
Real(-0.157), Real(0), Real(-1.492),
|
||||||
|
Real(-0.167), Real(-0.294), Real(-1.587),
|
||||||
|
Real(-0.193), Real(-0.476), Real(-1.835),
|
||||||
|
Real(-0.225), Real(-0.476), Real(-2.143),
|
||||||
|
Real(-0.251), Real(-0.294), Real(-2.391),
|
||||||
|
Real(0.261), Real(0), Real(-2.486),
|
||||||
|
Real(0.251), Real(0.294), Real(-2.391),
|
||||||
|
Real(0.225), Real(0.476), Real(-2.143),
|
||||||
|
Real(0.193), Real(0.476), Real(-1.835),
|
||||||
|
Real(0.167), Real(0.294), Real(-1.587),
|
||||||
|
Real(0.157), Real(0), Real(-1.492),
|
||||||
|
Real(0.167), Real(-0.294), Real(-1.587),
|
||||||
|
Real(0.193), Real(-0.476), Real(-1.835),
|
||||||
|
Real(0.225), Real(-0.476), Real(-2.143),
|
||||||
|
Real(0.251), Real(-0.294), Real(-2.391),
|
||||||
|
Real(0.773), Real(0), Real(-2.378),
|
||||||
|
Real(0.743), Real(0.294), Real(-2.287),
|
||||||
|
Real(0.666), Real(0.476), Real(-2.049),
|
||||||
|
Real(0.57), Real(0.476), Real(-1.755),
|
||||||
|
Real(0.493), Real(0.294), Real(-1.517),
|
||||||
|
Real(0.464), Real(0), Real(-1.427),
|
||||||
|
Real(0.493), Real(-0.294), Real(-1.517),
|
||||||
|
Real(0.57), Real(-0.476), Real(-1.755),
|
||||||
|
Real(0.666), Real(-0.476), Real(-2.049),
|
||||||
|
Real(0.743), Real(-0.294), Real(-2.287),
|
||||||
|
Real(1.25), Real(0), Real(-2.165),
|
||||||
|
Real(1.202), Real(0.294), Real(-2.082),
|
||||||
|
Real(1.077), Real(0.476), Real(-1.866),
|
||||||
|
Real(0.923), Real(0.476), Real(-1.598),
|
||||||
|
Real(0.798), Real(0.294), Real(-1.382),
|
||||||
|
Real(0.75), Real(0), Real(-1.299),
|
||||||
|
Real(0.798), Real(-0.294), Real(-1.382),
|
||||||
|
Real(0.923), Real(-0.476), Real(-1.598),
|
||||||
|
Real(1.077), Real(-0.476), Real(-1.866),
|
||||||
|
Real(1.202), Real(-0.294), Real(-2.082),
|
||||||
|
Real(1.673), Real(0), Real(-1.858),
|
||||||
|
Real(1.609), Real(0.294), Real(-1.787),
|
||||||
|
Real(1.442), Real(0.476), Real(-1.601),
|
||||||
|
Real(1.235), Real(0.476), Real(-1.371),
|
||||||
|
Real(1.068), Real(0.294), Real(-1.186),
|
||||||
|
Real(1.004), Real(0), Real(-1.115),
|
||||||
|
Real(1.068), Real(-0.294), Real(-1.186),
|
||||||
|
Real(1.235), Real(-0.476), Real(-1.371),
|
||||||
|
Real(1.442), Real(-0.476), Real(-1.601),
|
||||||
|
Real(1.609), Real(-0.294), Real(-1.787),
|
||||||
|
Real(2.023), Real(0), Real(-1.469),
|
||||||
|
Real(1.945), Real(0.294), Real(-1.413),
|
||||||
|
Real(1.743), Real(0.476), Real(-1.266),
|
||||||
|
Real(1.493), Real(0.476), Real(-1.085),
|
||||||
|
Real(1.291), Real(0.294), Real(-0.938),
|
||||||
|
Real(1.214), Real(0), Real(-0.882),
|
||||||
|
Real(1.291), Real(-0.294), Real(-0.938),
|
||||||
|
Real(1.493), Real(-0.476), Real(-1.085),
|
||||||
|
Real(1.743), Real(-0.476), Real(-1.266),
|
||||||
|
Real(1.945), Real(-0.294), Real(-1.413),
|
||||||
|
Real(2.284), Real(0), Real(-1.017),
|
||||||
|
Real(2.197), Real(0.294), Real(-0.978),
|
||||||
|
Real(1.968), Real(0.476), Real(-0.876),
|
||||||
|
Real(1.686), Real(0.476), Real(-0.751),
|
||||||
|
Real(1.458), Real(0.294), Real(-0.649),
|
||||||
|
Real(1.37), Real(0), Real(-0.61 ),
|
||||||
|
Real(1.458), Real(-0.294), Real(-0.649),
|
||||||
|
Real(1.686), Real(-0.476), Real(-0.751),
|
||||||
|
Real(1.968), Real(-0.476), Real(-0.876),
|
||||||
|
Real(2.197), Real(-0.294), Real(-0.978),
|
||||||
|
Real(2.445), Real(0), Real(-0.52 ),
|
||||||
|
Real(2.352), Real(0.294), Real(-0.5 ),
|
||||||
|
Real(2.107), Real(0.476), Real(-0.448),
|
||||||
|
Real(1.805), Real(0.476), Real(-0.384),
|
||||||
|
Real(1.561), Real(0.294), Real(-0.332),
|
||||||
|
Real(1.467), Real(0), Real(-0.312),
|
||||||
|
Real(1.561), Real(-0.294), Real(-0.332),
|
||||||
|
Real(1.805), Real(-0.476), Real(-0.384),
|
||||||
|
Real(2.107), Real(-0.476), Real(-0.448),
|
||||||
|
Real(2.352), Real(-0.294), Real(-0.5)
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int gIndices[NUM_TRIANGLES][3] = {
|
||||||
|
{0, 1, 11},
|
||||||
|
{1, 2, 12},
|
||||||
|
{2, 3, 13},
|
||||||
|
{3, 4, 14},
|
||||||
|
{4, 5, 15},
|
||||||
|
{5, 6, 16},
|
||||||
|
{6, 7, 17},
|
||||||
|
{7, 8, 18},
|
||||||
|
{8, 9, 19},
|
||||||
|
{9, 0, 10},
|
||||||
|
{10, 11, 21},
|
||||||
|
{11, 12, 22},
|
||||||
|
{12, 13, 23},
|
||||||
|
{13, 14, 24},
|
||||||
|
{14, 15, 25},
|
||||||
|
{15, 16, 26},
|
||||||
|
{16, 17, 27},
|
||||||
|
{17, 18, 28},
|
||||||
|
{18, 19, 29},
|
||||||
|
{19, 10, 20},
|
||||||
|
{20, 21, 31},
|
||||||
|
{21, 22, 32},
|
||||||
|
{22, 23, 33},
|
||||||
|
{23, 24, 34},
|
||||||
|
{24, 25, 35},
|
||||||
|
{25, 26, 36},
|
||||||
|
{26, 27, 37},
|
||||||
|
{27, 28, 38},
|
||||||
|
{28, 29, 39},
|
||||||
|
{29, 20, 30},
|
||||||
|
{30, 31, 41},
|
||||||
|
{31, 32, 42},
|
||||||
|
{32, 33, 43},
|
||||||
|
{33, 34, 44},
|
||||||
|
{34, 35, 45},
|
||||||
|
{35, 36, 46},
|
||||||
|
{36, 37, 47},
|
||||||
|
{37, 38, 48},
|
||||||
|
{38, 39, 49},
|
||||||
|
{39, 30, 40},
|
||||||
|
{40, 41, 51},
|
||||||
|
{41, 42, 52},
|
||||||
|
{42, 43, 53},
|
||||||
|
{43, 44, 54},
|
||||||
|
{44, 45, 55},
|
||||||
|
{45, 46, 56},
|
||||||
|
{46, 47, 57},
|
||||||
|
{47, 48, 58},
|
||||||
|
{48, 49, 59},
|
||||||
|
{49, 40, 50},
|
||||||
|
{50, 51, 61},
|
||||||
|
{51, 52, 62},
|
||||||
|
{52, 53, 63},
|
||||||
|
{53, 54, 64},
|
||||||
|
{54, 55, 65},
|
||||||
|
{55, 56, 66},
|
||||||
|
{56, 57, 67},
|
||||||
|
{57, 58, 68},
|
||||||
|
{58, 59, 69},
|
||||||
|
{59, 50, 60},
|
||||||
|
{60, 61, 71},
|
||||||
|
{61, 62, 72},
|
||||||
|
{62, 63, 73},
|
||||||
|
{63, 64, 74},
|
||||||
|
{64, 65, 75},
|
||||||
|
{65, 66, 76},
|
||||||
|
{66, 67, 77},
|
||||||
|
{67, 68, 78},
|
||||||
|
{68, 69, 79},
|
||||||
|
{69, 60, 70},
|
||||||
|
{70, 71, 81},
|
||||||
|
{71, 72, 82},
|
||||||
|
{72, 73, 83},
|
||||||
|
{73, 74, 84},
|
||||||
|
{74, 75, 85},
|
||||||
|
{75, 76, 86},
|
||||||
|
{76, 77, 87},
|
||||||
|
{77, 78, 88},
|
||||||
|
{78, 79, 89},
|
||||||
|
{79, 70, 80},
|
||||||
|
{80, 81, 91},
|
||||||
|
{81, 82, 92},
|
||||||
|
{82, 83, 93},
|
||||||
|
{83, 84, 94},
|
||||||
|
{84, 85, 95},
|
||||||
|
{85, 86, 96},
|
||||||
|
{86, 87, 97},
|
||||||
|
{87, 88, 98},
|
||||||
|
{88, 89, 99},
|
||||||
|
{89, 80, 90},
|
||||||
|
{90, 91, 101},
|
||||||
|
{91, 92, 102},
|
||||||
|
{92, 93, 103},
|
||||||
|
{93, 94, 104},
|
||||||
|
{94, 95, 105},
|
||||||
|
{95, 96, 106},
|
||||||
|
{96, 97, 107},
|
||||||
|
{97, 98, 108},
|
||||||
|
{98, 99, 109},
|
||||||
|
{99, 90, 100},
|
||||||
|
{100, 101, 111},
|
||||||
|
{101, 102, 112},
|
||||||
|
{102, 103, 113},
|
||||||
|
{103, 104, 114},
|
||||||
|
{104, 105, 115},
|
||||||
|
{105, 106, 116},
|
||||||
|
{106, 107, 117},
|
||||||
|
{107, 108, 118},
|
||||||
|
{108, 109, 119},
|
||||||
|
{109, 100, 110},
|
||||||
|
{110, 111, 121},
|
||||||
|
{111, 112, 122},
|
||||||
|
{112, 113, 123},
|
||||||
|
{113, 114, 124},
|
||||||
|
{114, 115, 125},
|
||||||
|
{115, 116, 126},
|
||||||
|
{116, 117, 127},
|
||||||
|
{117, 118, 128},
|
||||||
|
{118, 119, 129},
|
||||||
|
{119, 110, 120},
|
||||||
|
{120, 121, 131},
|
||||||
|
{121, 122, 132},
|
||||||
|
{122, 123, 133},
|
||||||
|
{123, 124, 134},
|
||||||
|
{124, 125, 135},
|
||||||
|
{125, 126, 136},
|
||||||
|
{126, 127, 137},
|
||||||
|
{127, 128, 138},
|
||||||
|
{128, 129, 139},
|
||||||
|
{129, 120, 130},
|
||||||
|
{130, 131, 141},
|
||||||
|
{131, 132, 142},
|
||||||
|
{132, 133, 143},
|
||||||
|
{133, 134, 144},
|
||||||
|
{134, 135, 145},
|
||||||
|
{135, 136, 146},
|
||||||
|
{136, 137, 147},
|
||||||
|
{137, 138, 148},
|
||||||
|
{138, 139, 149},
|
||||||
|
{139, 130, 140},
|
||||||
|
{140, 141, 151},
|
||||||
|
{141, 142, 152},
|
||||||
|
{142, 143, 153},
|
||||||
|
{143, 144, 154},
|
||||||
|
{144, 145, 155},
|
||||||
|
{145, 146, 156},
|
||||||
|
{146, 147, 157},
|
||||||
|
{147, 148, 158},
|
||||||
|
{148, 149, 159},
|
||||||
|
{149, 140, 150},
|
||||||
|
{150, 151, 161},
|
||||||
|
{151, 152, 162},
|
||||||
|
{152, 153, 163},
|
||||||
|
{153, 154, 164},
|
||||||
|
{154, 155, 165},
|
||||||
|
{155, 156, 166},
|
||||||
|
{156, 157, 167},
|
||||||
|
{157, 158, 168},
|
||||||
|
{158, 159, 169},
|
||||||
|
{159, 150, 160},
|
||||||
|
{160, 161, 171},
|
||||||
|
{161, 162, 172},
|
||||||
|
{162, 163, 173},
|
||||||
|
{163, 164, 174},
|
||||||
|
{164, 165, 175},
|
||||||
|
{165, 166, 176},
|
||||||
|
{166, 167, 177},
|
||||||
|
{167, 168, 178},
|
||||||
|
{168, 169, 179},
|
||||||
|
{169, 160, 170},
|
||||||
|
{170, 171, 181},
|
||||||
|
{171, 172, 182},
|
||||||
|
{172, 173, 183},
|
||||||
|
{173, 174, 184},
|
||||||
|
{174, 175, 185},
|
||||||
|
{175, 176, 186},
|
||||||
|
{176, 177, 187},
|
||||||
|
{177, 178, 188},
|
||||||
|
{178, 179, 189},
|
||||||
|
{179, 170, 180},
|
||||||
|
{180, 181, 191},
|
||||||
|
{181, 182, 192},
|
||||||
|
{182, 183, 193},
|
||||||
|
{183, 184, 194},
|
||||||
|
{184, 185, 195},
|
||||||
|
{185, 186, 196},
|
||||||
|
{186, 187, 197},
|
||||||
|
{187, 188, 198},
|
||||||
|
{188, 189, 199},
|
||||||
|
{189, 180, 190},
|
||||||
|
{190, 191, 201},
|
||||||
|
{191, 192, 202},
|
||||||
|
{192, 193, 203},
|
||||||
|
{193, 194, 204},
|
||||||
|
{194, 195, 205},
|
||||||
|
{195, 196, 206},
|
||||||
|
{196, 197, 207},
|
||||||
|
{197, 198, 208},
|
||||||
|
{198, 199, 209},
|
||||||
|
{199, 190, 200},
|
||||||
|
{200, 201, 211},
|
||||||
|
{201, 202, 212},
|
||||||
|
{202, 203, 213},
|
||||||
|
{203, 204, 214},
|
||||||
|
{204, 205, 215},
|
||||||
|
{205, 206, 216},
|
||||||
|
{206, 207, 217},
|
||||||
|
{207, 208, 218},
|
||||||
|
{208, 209, 219},
|
||||||
|
{209, 200, 210},
|
||||||
|
{210, 211, 221},
|
||||||
|
{211, 212, 222},
|
||||||
|
{212, 213, 223},
|
||||||
|
{213, 214, 224},
|
||||||
|
{214, 215, 225},
|
||||||
|
{215, 216, 226},
|
||||||
|
{216, 217, 227},
|
||||||
|
{217, 218, 228},
|
||||||
|
{218, 219, 229},
|
||||||
|
{219, 210, 220},
|
||||||
|
{220, 221, 231},
|
||||||
|
{221, 222, 232},
|
||||||
|
{222, 223, 233},
|
||||||
|
{223, 224, 234},
|
||||||
|
{224, 225, 235},
|
||||||
|
{225, 226, 236},
|
||||||
|
{226, 227, 237},
|
||||||
|
{227, 228, 238},
|
||||||
|
{228, 229, 239},
|
||||||
|
{229, 220, 230},
|
||||||
|
{230, 231, 241},
|
||||||
|
{231, 232, 242},
|
||||||
|
{232, 233, 243},
|
||||||
|
{233, 234, 244},
|
||||||
|
{234, 235, 245},
|
||||||
|
{235, 236, 246},
|
||||||
|
{236, 237, 247},
|
||||||
|
{237, 238, 248},
|
||||||
|
{238, 239, 249},
|
||||||
|
{239, 230, 240},
|
||||||
|
{240, 241, 251},
|
||||||
|
{241, 242, 252},
|
||||||
|
{242, 243, 253},
|
||||||
|
{243, 244, 254},
|
||||||
|
{244, 245, 255},
|
||||||
|
{245, 246, 256},
|
||||||
|
{246, 247, 257},
|
||||||
|
{247, 248, 258},
|
||||||
|
{248, 249, 259},
|
||||||
|
{249, 240, 250},
|
||||||
|
{250, 251, 261},
|
||||||
|
{251, 252, 262},
|
||||||
|
{252, 253, 263},
|
||||||
|
{253, 254, 264},
|
||||||
|
{254, 255, 265},
|
||||||
|
{255, 256, 266},
|
||||||
|
{256, 257, 267},
|
||||||
|
{257, 258, 268},
|
||||||
|
{258, 259, 269},
|
||||||
|
{259, 250, 260},
|
||||||
|
{260, 261, 271},
|
||||||
|
{261, 262, 272},
|
||||||
|
{262, 263, 273},
|
||||||
|
{263, 264, 274},
|
||||||
|
{264, 265, 275},
|
||||||
|
{265, 266, 276},
|
||||||
|
{266, 267, 277},
|
||||||
|
{267, 268, 278},
|
||||||
|
{268, 269, 279},
|
||||||
|
{269, 260, 270},
|
||||||
|
{270, 271, 281},
|
||||||
|
{271, 272, 282},
|
||||||
|
{272, 273, 283},
|
||||||
|
{273, 274, 284},
|
||||||
|
{274, 275, 285},
|
||||||
|
{275, 276, 286},
|
||||||
|
{276, 277, 287},
|
||||||
|
{277, 278, 288},
|
||||||
|
{278, 279, 289},
|
||||||
|
{279, 270, 280},
|
||||||
|
{280, 281, 291},
|
||||||
|
{281, 282, 292},
|
||||||
|
{282, 283, 293},
|
||||||
|
{283, 284, 294},
|
||||||
|
{284, 285, 295},
|
||||||
|
{285, 286, 296},
|
||||||
|
{286, 287, 297},
|
||||||
|
{287, 288, 298},
|
||||||
|
{288, 289, 299},
|
||||||
|
{289, 280, 290},
|
||||||
|
{290, 291, 1},
|
||||||
|
{291, 292, 2},
|
||||||
|
{292, 293, 3},
|
||||||
|
{293, 294, 4},
|
||||||
|
{294, 295, 5},
|
||||||
|
{295, 296, 6},
|
||||||
|
{296, 297, 7},
|
||||||
|
{297, 298, 8},
|
||||||
|
{298, 299, 9},
|
||||||
|
{299, 290, 0},
|
||||||
|
{0, 11, 10},
|
||||||
|
{1, 12, 11},
|
||||||
|
{2, 13, 12},
|
||||||
|
{3, 14, 13},
|
||||||
|
{4, 15, 14},
|
||||||
|
{5, 16, 15},
|
||||||
|
{6, 17, 16},
|
||||||
|
{7, 18, 17},
|
||||||
|
{8, 19, 18},
|
||||||
|
{9, 10, 19},
|
||||||
|
{10, 21, 20},
|
||||||
|
{11, 22, 21},
|
||||||
|
{12, 23, 22},
|
||||||
|
{13, 24, 23},
|
||||||
|
{14, 25, 24},
|
||||||
|
{15, 26, 25},
|
||||||
|
{16, 27, 26},
|
||||||
|
{17, 28, 27},
|
||||||
|
{18, 29, 28},
|
||||||
|
{19, 20, 29},
|
||||||
|
{20, 31, 30},
|
||||||
|
{21, 32, 31},
|
||||||
|
{22, 33, 32},
|
||||||
|
{23, 34, 33},
|
||||||
|
{24, 35, 34},
|
||||||
|
{25, 36, 35},
|
||||||
|
{26, 37, 36},
|
||||||
|
{27, 38, 37},
|
||||||
|
{28, 39, 38},
|
||||||
|
{29, 30, 39},
|
||||||
|
{30, 41, 40},
|
||||||
|
{31, 42, 41},
|
||||||
|
{32, 43, 42},
|
||||||
|
{33, 44, 43},
|
||||||
|
{34, 45, 44},
|
||||||
|
{35, 46, 45},
|
||||||
|
{36, 47, 46},
|
||||||
|
{37, 48, 47},
|
||||||
|
{38, 49, 48},
|
||||||
|
{39, 40, 49},
|
||||||
|
{40, 51, 50},
|
||||||
|
{41, 52, 51},
|
||||||
|
{42, 53, 52},
|
||||||
|
{43, 54, 53},
|
||||||
|
{44, 55, 54},
|
||||||
|
{45, 56, 55},
|
||||||
|
{46, 57, 56},
|
||||||
|
{47, 58, 57},
|
||||||
|
{48, 59, 58},
|
||||||
|
{49, 50, 59},
|
||||||
|
{50, 61, 60},
|
||||||
|
{51, 62, 61},
|
||||||
|
{52, 63, 62},
|
||||||
|
{53, 64, 63},
|
||||||
|
{54, 65, 64},
|
||||||
|
{55, 66, 65},
|
||||||
|
{56, 67, 66},
|
||||||
|
{57, 68, 67},
|
||||||
|
{58, 69, 68},
|
||||||
|
{59, 60, 69},
|
||||||
|
{60, 71, 70},
|
||||||
|
{61, 72, 71},
|
||||||
|
{62, 73, 72},
|
||||||
|
{63, 74, 73},
|
||||||
|
{64, 75, 74},
|
||||||
|
{65, 76, 75},
|
||||||
|
{66, 77, 76},
|
||||||
|
{67, 78, 77},
|
||||||
|
{68, 79, 78},
|
||||||
|
{69, 70, 79},
|
||||||
|
{70, 81, 80},
|
||||||
|
{71, 82, 81},
|
||||||
|
{72, 83, 82},
|
||||||
|
{73, 84, 83},
|
||||||
|
{74, 85, 84},
|
||||||
|
{75, 86, 85},
|
||||||
|
{76, 87, 86},
|
||||||
|
{77, 88, 87},
|
||||||
|
{78, 89, 88},
|
||||||
|
{79, 80, 89},
|
||||||
|
{80, 91, 90},
|
||||||
|
{81, 92, 91},
|
||||||
|
{82, 93, 92},
|
||||||
|
{83, 94, 93},
|
||||||
|
{84, 95, 94},
|
||||||
|
{85, 96, 95},
|
||||||
|
{86, 97, 96},
|
||||||
|
{87, 98, 97},
|
||||||
|
{88, 99, 98},
|
||||||
|
{89, 90, 99},
|
||||||
|
{90, 101, 100},
|
||||||
|
{91, 102, 101},
|
||||||
|
{92, 103, 102},
|
||||||
|
{93, 104, 103},
|
||||||
|
{94, 105, 104},
|
||||||
|
{95, 106, 105},
|
||||||
|
{96, 107, 106},
|
||||||
|
{97, 108, 107},
|
||||||
|
{98, 109, 108},
|
||||||
|
{99, 100, 109},
|
||||||
|
{100, 111, 110},
|
||||||
|
{101, 112, 111},
|
||||||
|
{102, 113, 112},
|
||||||
|
{103, 114, 113},
|
||||||
|
{104, 115, 114},
|
||||||
|
{105, 116, 115},
|
||||||
|
{106, 117, 116},
|
||||||
|
{107, 118, 117},
|
||||||
|
{108, 119, 118},
|
||||||
|
{109, 110, 119},
|
||||||
|
{110, 121, 120},
|
||||||
|
{111, 122, 121},
|
||||||
|
{112, 123, 122},
|
||||||
|
{113, 124, 123},
|
||||||
|
{114, 125, 124},
|
||||||
|
{115, 126, 125},
|
||||||
|
{116, 127, 126},
|
||||||
|
{117, 128, 127},
|
||||||
|
{118, 129, 128},
|
||||||
|
{119, 120, 129},
|
||||||
|
{120, 131, 130},
|
||||||
|
{121, 132, 131},
|
||||||
|
{122, 133, 132},
|
||||||
|
{123, 134, 133},
|
||||||
|
{124, 135, 134},
|
||||||
|
{125, 136, 135},
|
||||||
|
{126, 137, 136},
|
||||||
|
{127, 138, 137},
|
||||||
|
{128, 139, 138},
|
||||||
|
{129, 130, 139},
|
||||||
|
{130, 141, 140},
|
||||||
|
{131, 142, 141},
|
||||||
|
{132, 143, 142},
|
||||||
|
{133, 144, 143},
|
||||||
|
{134, 145, 144},
|
||||||
|
{135, 146, 145},
|
||||||
|
{136, 147, 146},
|
||||||
|
{137, 148, 147},
|
||||||
|
{138, 149, 148},
|
||||||
|
{139, 140, 149},
|
||||||
|
{140, 151, 150},
|
||||||
|
{141, 152, 151},
|
||||||
|
{142, 153, 152},
|
||||||
|
{143, 154, 153},
|
||||||
|
{144, 155, 154},
|
||||||
|
{145, 156, 155},
|
||||||
|
{146, 157, 156},
|
||||||
|
{147, 158, 157},
|
||||||
|
{148, 159, 158},
|
||||||
|
{149, 150, 159},
|
||||||
|
{150, 161, 160},
|
||||||
|
{151, 162, 161},
|
||||||
|
{152, 163, 162},
|
||||||
|
{153, 164, 163},
|
||||||
|
{154, 165, 164},
|
||||||
|
{155, 166, 165},
|
||||||
|
{156, 167, 166},
|
||||||
|
{157, 168, 167},
|
||||||
|
{158, 169, 168},
|
||||||
|
{159, 160, 169},
|
||||||
|
{160, 171, 170},
|
||||||
|
{161, 172, 171},
|
||||||
|
{162, 173, 172},
|
||||||
|
{163, 174, 173},
|
||||||
|
{164, 175, 174},
|
||||||
|
{165, 176, 175},
|
||||||
|
{166, 177, 176},
|
||||||
|
{167, 178, 177},
|
||||||
|
{168, 179, 178},
|
||||||
|
{169, 170, 179},
|
||||||
|
{170, 181, 180},
|
||||||
|
{171, 182, 181},
|
||||||
|
{172, 183, 182},
|
||||||
|
{173, 184, 183},
|
||||||
|
{174, 185, 184},
|
||||||
|
{175, 186, 185},
|
||||||
|
{176, 187, 186},
|
||||||
|
{177, 188, 187},
|
||||||
|
{178, 189, 188},
|
||||||
|
{179, 180, 189},
|
||||||
|
{180, 191, 190},
|
||||||
|
{181, 192, 191},
|
||||||
|
{182, 193, 192},
|
||||||
|
{183, 194, 193},
|
||||||
|
{184, 195, 194},
|
||||||
|
{185, 196, 195},
|
||||||
|
{186, 197, 196},
|
||||||
|
{187, 198, 197},
|
||||||
|
{188, 199, 198},
|
||||||
|
{189, 190, 199},
|
||||||
|
{190, 201, 200},
|
||||||
|
{191, 202, 201},
|
||||||
|
{192, 203, 202},
|
||||||
|
{193, 204, 203},
|
||||||
|
{194, 205, 204},
|
||||||
|
{195, 206, 205},
|
||||||
|
{196, 207, 206},
|
||||||
|
{197, 208, 207},
|
||||||
|
{198, 209, 208},
|
||||||
|
{199, 200, 209},
|
||||||
|
{200, 211, 210},
|
||||||
|
{201, 212, 211},
|
||||||
|
{202, 213, 212},
|
||||||
|
{203, 214, 213},
|
||||||
|
{204, 215, 214},
|
||||||
|
{205, 216, 215},
|
||||||
|
{206, 217, 216},
|
||||||
|
{207, 218, 217},
|
||||||
|
{208, 219, 218},
|
||||||
|
{209, 210, 219},
|
||||||
|
{210, 221, 220},
|
||||||
|
{211, 222, 221},
|
||||||
|
{212, 223, 222},
|
||||||
|
{213, 224, 223},
|
||||||
|
{214, 225, 224},
|
||||||
|
{215, 226, 225},
|
||||||
|
{216, 227, 226},
|
||||||
|
{217, 228, 227},
|
||||||
|
{218, 229, 228},
|
||||||
|
{219, 220, 229},
|
||||||
|
{220, 231, 230},
|
||||||
|
{221, 232, 231},
|
||||||
|
{222, 233, 232},
|
||||||
|
{223, 234, 233},
|
||||||
|
{224, 235, 234},
|
||||||
|
{225, 236, 235},
|
||||||
|
{226, 237, 236},
|
||||||
|
{227, 238, 237},
|
||||||
|
{228, 239, 238},
|
||||||
|
{229, 230, 239},
|
||||||
|
{230, 241, 240},
|
||||||
|
{231, 242, 241},
|
||||||
|
{232, 243, 242},
|
||||||
|
{233, 244, 243},
|
||||||
|
{234, 245, 244},
|
||||||
|
{235, 246, 245},
|
||||||
|
{236, 247, 246},
|
||||||
|
{237, 248, 247},
|
||||||
|
{238, 249, 248},
|
||||||
|
{239, 240, 249},
|
||||||
|
{240, 251, 250},
|
||||||
|
{241, 252, 251},
|
||||||
|
{242, 253, 252},
|
||||||
|
{243, 254, 253},
|
||||||
|
{244, 255, 254},
|
||||||
|
{245, 256, 255},
|
||||||
|
{246, 257, 256},
|
||||||
|
{247, 258, 257},
|
||||||
|
{248, 259, 258},
|
||||||
|
{249, 250, 259},
|
||||||
|
{250, 261, 260},
|
||||||
|
{251, 262, 261},
|
||||||
|
{252, 263, 262},
|
||||||
|
{253, 264, 263},
|
||||||
|
{254, 265, 264},
|
||||||
|
{255, 266, 265},
|
||||||
|
{256, 267, 266},
|
||||||
|
{257, 268, 267},
|
||||||
|
{258, 269, 268},
|
||||||
|
{259, 260, 269},
|
||||||
|
{260, 271, 270},
|
||||||
|
{261, 272, 271},
|
||||||
|
{262, 273, 272},
|
||||||
|
{263, 274, 273},
|
||||||
|
{264, 275, 274},
|
||||||
|
{265, 276, 275},
|
||||||
|
{266, 277, 276},
|
||||||
|
{267, 278, 277},
|
||||||
|
{268, 279, 278},
|
||||||
|
{269, 270, 279},
|
||||||
|
{270, 281, 280},
|
||||||
|
{271, 282, 281},
|
||||||
|
{272, 283, 282},
|
||||||
|
{273, 284, 283},
|
||||||
|
{274, 285, 284},
|
||||||
|
{275, 286, 285},
|
||||||
|
{276, 287, 286},
|
||||||
|
{277, 288, 287},
|
||||||
|
{278, 289, 288},
|
||||||
|
{279, 280, 289},
|
||||||
|
{280, 291, 290},
|
||||||
|
{281, 292, 291},
|
||||||
|
{282, 293, 292},
|
||||||
|
{283, 294, 293},
|
||||||
|
{284, 295, 294},
|
||||||
|
{285, 296, 295},
|
||||||
|
{286, 297, 296},
|
||||||
|
{287, 298, 297},
|
||||||
|
{288, 299, 298},
|
||||||
|
{289, 290, 299},
|
||||||
|
{290, 1, 0},
|
||||||
|
{291, 2, 1},
|
||||||
|
{292, 3, 2},
|
||||||
|
{293, 4, 3},
|
||||||
|
{294, 5, 4},
|
||||||
|
{295, 6, 5},
|
||||||
|
{296, 7, 6},
|
||||||
|
{297, 8, 7},
|
||||||
|
{298, 9, 8},
|
||||||
|
{299, 0, 9},
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user